1 /-
2 Copyright (c) 2017 Mario Carneiro. All rights reserved.
3 Released under Apache 2.0 license as described in the file LICENSE.
4 Authors: Mario Carneiro
5 -/
6 import data.nat.modeq data.zsqrtd.basic tactic.ring
src └────────────┘ └───────────────┘ └─────────┘
7
8 namespace pell
9 open nat
10
11 section
12 parameters {a : ℕ} (a1 : a > 1)
id ┴ ┴
src ┴ ┴
typ ┴ ┴
13
14 include a1
15 private def d := a*a - 1
id ┴┴┴ ┴
src ┴ ┴
typ ┴┴┴ ┴
16
17 @[simp] theorem d_pos : 0 < d := nat.sub_pos_of_lt (mul_lt_mul a1 (le_of_lt a1) dec_trivial dec_trivial : 1*1<a*a)
id ┴ ┴ └───────────────┘ └────────┘ └┘ └──────┘ └┘ └─────────┘ └─────────┘ ┴ ┴┴┴┴
src ┴ ┴ └───────────────┘ └────────┘ └──────┘ └─────────┘ └─────────┘ ┴ ┴ ┴
typ ┴ ┴ └───────────────┘ └────────┘ └┘ └──────┘ └┘ └─────────┘ └─────────┘ ┴ ┴┴┴┴
doc └──┘ └─────────┘ └─────────┘
18
19 /-- The Pell sequences, defined together in mutual recursion. -/
20 -- TODO(lint): Fix double namespace issue
21 @[nolint] def pell : ℕ → ℕ × ℕ :=
id ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴
doc └────┘
22 λn, nat.rec_on n (1, 0) (λn xy, (xy.1*a + d*xy.2, xy.1 + xy.2*a))
id ┴ └────────┘ ┴ ┴ ┴ └┘ ┴└┘┴ ┴┴ ┴ ┴┴└┘┴ └┘┴ ┴ └┘┴ ┴┴
src └────────┘ ┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴ ┴
typ ┴ └────────┘ ┴ ┴ ┴ └┘ ┴└┘┴ ┴┴ ┴ ┴┴└┘┴ └┘┴ ┴ └┘┴ ┴┴
23
24 /-- The Pell `x` sequence. -/
25 def xn (n : ℕ) : ℕ := (pell n).1
id ┴ ┴ └──┘ ┴ ┴
src ┴ ┴ └──┘ ┴
typ ┴ ┴ └──┘ ┴ ┴
doc └──┘
26 /-- The Pell `y` sequence. -/
27 def yn (n : ℕ) : ℕ := (pell n).2
id ┴ ┴ └──┘ ┴ ┴
src ┴ ┴ └──┘ ┴
typ ┴ ┴ └──┘ ┴ ┴
doc └──┘
28
29 @[simp] theorem pell_val (n : ℕ) : pell n = (xn n, yn n) :=
id ┴ └──┘ ┴ ┴ ┴└┘ ┴ └┘ ┴
src ┴ └──┘ ┴ ┴└┘ └┘
typ ┴ └──┘ ┴ ┴ ┴└┘ ┴ └┘ ┴
doc └──┘ └──┘ └┘ └┘
30 show pell n = ((pell n).1, (pell n).2), from match pell n with (a, b) := rfl end
id └──┘ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ ┴ ┴ └──┘ ┴ ┴ └─┘
src └──┘ ┴ ┴ └──┘ ┴ └──┘ ┴ └──┘ ┴ └─┘
typ └──┘ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ ┴ ┴ └──┘ ┴ ┴ └─┘
doc └──┘ └──┘ └──┘ └──┘
31
32 @[simp] theorem xn_zero : xn 0 = 1 := rfl
id └┘ ┴ └─┘
src └┘ ┴ └─┘
typ └┘ ┴ └─┘
doc └──┘ └┘
33 @[simp] theorem yn_zero : yn 0 = 0 := rfl
id └┘ ┴ └─┘
src └┘ ┴ └─┘
typ └┘ ┴ └─┘
doc └──┘ └┘
34
35 @[simp] theorem xn_succ (n : ℕ) : xn (n+1) = xn n * a + d * yn n := rfl
id ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └─┘
src ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ └─┘
typ ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └─┘
doc └──┘ └┘ └┘ └┘
36 @[simp] theorem yn_succ (n : ℕ) : yn (n+1) = xn n + yn n * a := rfl
id ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
src ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ └─┘
typ ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
doc └──┘ └┘ └┘ └┘
37
38 @[simp] theorem xn_one : xn 1 = a := by simp
id └┘ ┴ ┴
src └┘ ┴ └────
typ └┘ ┴ ┴ └────
doc └──┘ └┘ └────
txt └────
par └────
pid └
st └─────
39 @[simp] theorem yn_one : yn 1 = 1 := by simp
id └┘ ┴
src ─┘ └┘ ┴ └────
typ ─┘ └┘ ┴ └────
doc ─┘ └──┘ └┘ └────
txt ─┘ └────
par ─┘ └────
pid ─┘ └
st ─┘ └─────
40
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
41 def xz (n : ℕ) : ℤ := xn n
id ┴ ┴ └┘ ┴
src ─┘ ┴ ┴ └┘
typ ─┘ ┴ ┴ └┘ ┴
doc ─┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
42 def yz (n : ℕ) : ℤ := yn n
id ┴ ┴ └┘ ┴
src ┴ ┴ └┘
typ ┴ ┴ └┘ ┴
doc └┘
43 def az : ℤ := a
id ┴ ┴
src ┴
typ ┴ ┴
44
45 theorem asq_pos : 0 < a*a :=
id ┴ ┴┴┴
src ┴ ┴
typ ┴ ┴┴┴
46 le_trans (le_of_lt a1) (by have := @nat.mul_le_mul_left 1 a a (le_of_lt a1); rwa mul_one at this)
id └──────┘ └──────┘ └┘ └─────────────────┘ ┴ └──────┘ └┘ └─────┘
src └──────┘ └──────┘ └──────┘ └─────────────────┘└─┘ ┴ ┴ └──────┘┴ ┴ └──┘└─────┘└──────┘
typ └──────┘ └──────┘ └┘ └──────┘ └─────────────────┘└─┘ ┴┴┴ └──────┘┴└┘┴ └──┘└─────┘└──────┘
doc └──────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ └──────┘
txt └──────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ └──────┘
par └──────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ └──────┘
pid └───┘└─┘ └─┘ ┴ ┴ ┴ ┴ ┴ └──────┘
st └─────────────────────────────────────────────────────┘└─────┘└──────┘
47
48 theorem dz_val : ↑d = az*az - 1 :=
id ┴┴ ┴ └┘┴└┘ ┴
src ┴┴ ┴ └┘┴└┘ ┴
typ ┴┴ ┴ └┘┴└┘ ┴
49 have 1 ≤ a*a, from asq_pos,
id ┴ ┴┴┴ └─────┘
src ┴ ┴ └─────┘
typ ┴ ┴┴┴ └─────┘
50 show ↑(a*a - 1) = _, by rw int.coe_nat_sub this; refl
id ┴ ┴┴┴ ┴ ┴ └─────────────┘ └──┘
src ┴ ┴ ┴ ┴ └─┘└─────────────┘┴ └────
typ ┴ ┴┴┴ ┴ ┴ └─┘└─────────────┘┴└──┘ └────
doc └─┘ ┴ └────
txt └─┘ ┴ └────
par └─┘ ┴ └────
pid ┴ ┴ └
st └──────────────────────────────
51
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
52 @[simp] theorem xz_succ (n : ℕ) : xz (n+1) = xz n * az + ↑d * yz n := rfl
id ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴┴ ┴ └┘ ┴ └─┘
src ─┘ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴┴ ┴ └┘ └─┘
typ ─┘ ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴┴ ┴ └┘ ┴ └─┘
doc ─┘ └──┘
txt ─┘
par ─┘
pid ─┘
st ─┘
53 @[simp] theorem yz_succ (n : ℕ) : yz (n+1) = xz n + yz n * az := rfl
id ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ └─┘
src ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ └┘ └─┘
typ ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ └─┘
doc └──┘
54
55 /-- The Pell sequence can also be viewed as an element of `ℤ√d` -/
56 def pell_zd (n : ℕ) : ℤ√d := ⟨xn n, yn n⟩
id ┴ └┘┴ └┘ ┴ └┘ ┴
src ┴ └┘┴ └┘ └┘
typ ┴ └┘┴ └┘ ┴ └┘ ┴
doc └┘ └┘ └┘
57 @[simp] theorem pell_zd_re (n : ℕ) : (pell_zd n).re = xn n := rfl
id ┴ └─────┘ ┴ └┘ ┴ └┘ ┴ └─┘
src ┴ └─────┘ └┘ ┴ └┘ └─┘
typ ┴ └─────┘ ┴ └┘ ┴ └┘ ┴ └─┘
doc └──┘ └─────┘ └┘
58 @[simp] theorem pell_zd_im (n : ℕ) : (pell_zd n).im = yn n := rfl
id ┴ └─────┘ ┴ └┘ ┴ └┘ ┴ └─┘
src ┴ └─────┘ └┘ ┴ └┘ └─┘
typ ┴ └─────┘ ┴ └┘ ┴ └┘ ┴ └─┘
doc └──┘ └─────┘ └┘
59
60 /-- The property of being a solution to the Pell equation, expressed
61 as a property of elements of `ℤ√d`. -/
62 def is_pell : ℤ√d → Prop | ⟨x, y⟩ := x*x - d*y*y = 1
id └┘┴ ┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴
src └┘┴ ┴ ┴ ┴┴ ┴ ┴
typ └┘┴ ┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴
doc └┘
63
64 theorem is_pell_nat {x y : ℕ} : is_pell ⟨x, y⟩ ↔ x*x - d*y*y = 1 :=
id ┴ └─────┘ ┴ ┴ ┴ ┴┴┴ ┴ ┴┴┴┴┴ ┴
src ┴ └─────┘ ┴ ┴ ┴ ┴┴ ┴ ┴
typ ┴ └─────┘ ┴ ┴ ┴ ┴┴┴ ┴ ┴┴┴┴┴ ┴
doc └─────┘
65 ⟨λh, int.coe_nat_inj (by rw int.coe_nat_sub (int.le_of_coe_nat_le_coe_nat $ int.le.intro_sub h); exact h),
id ┴ └─────────────┘ └─────────────┘ └──────────────────────────┘ └──────────────┘ ┴ ┴
src └─────────────┘ └─┘└─────────────┘┴ └──────────────────────────┘┴ ┴└──────────────┘┴ ┴ └────┘
typ ┴ └─────────────┘ └─┘└─────────────┘┴ └──────────────────────────┘┴ ┴└──────────────┘┴┴┴ └────┘┴
doc └─┘ ┴ ┴ ┴ ┴ ┴ └────┘
txt └─┘ ┴ ┴ ┴ ┴ ┴ └────┘
par └─┘ ┴ ┴ ┴ ┴ ┴ └────┘
pid ┴ ┴ ┴ ┴ ┴ ┴ ┴
st └──────────────────────────────────────────────────────────────────────────────┘
66 λh, show ((x*x : ℕ) - (d*y*y:ℕ) : ℤ) = 1, by rw [← int.coe_nat_sub $ le_of_lt $ nat.lt_of_sub_eq_succ h, h]; refl⟩
id ┴ ┴┴┴ ┴ ┴ ┴┴┴┴┴ ┴ ┴ ┴ └─────────────┘ └──────┘ └───────────────────┘ ┴ ┴
src ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴ └────┘└─────────────┘┴ ┴└──────┘┴ ┴└───────────────────┘┴ └┘ ┴ └──┘
typ ┴ ┴┴┴ ┴ ┴ ┴┴┴┴┴ ┴ ┴ ┴ └────┘└─────────────┘┴ ┴└──────┘┴ ┴└───────────────────┘┴┴└┘┴┴ └──┘
doc └────┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘
txt └────┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘
par └────┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘
pid └──┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴
st └─────────────────────────────────────────────────────────┘└─┘┴└────┘
67
68 theorem is_pell_norm : Π {b : ℤ√d}, is_pell b ↔ b * b.conj = 1
id ┴ └┘┴ └─────┘ ┴ ┴ ┴ ┴ ┴└───┘ ┴
src └┘┴ └─────┘ ┴ ┴ └───┘ ┴
typ ┴ └┘┴ └─────┘ ┴ ┴ ┴ ┴ ┴└───┘ ┴
doc └┘ └─────┘ └───┘
69 | ⟨x, y⟩ := by simp [zsqrtd.ext, is_pell, mul_comm]
id └────────┘ └─────┘ └──────┘
src └────┘└────────┘└┘└─────┘└┘└──────┘└─
typ └────┘└────────┘└┘└─────┘└┘└──────┘└─
doc └────┘ └┘└─────┘└┘ └─
txt └────┘ └┘ └┘ └─
par └────┘ └┘ └┘ └─
pid ┴┴ └┘ └┘ ┴└
st └─────────────────────────────────────
70
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
71 theorem is_pell_mul {b c : ℤ√d} (hb : is_pell b) (hc : is_pell c) : is_pell (b * c) :=
id └┘┴ └─────┘ ┴ └─────┘ ┴ └─────┘ ┴ ┴ ┴
src ─┘ └┘┴ └─────┘ └─────┘ └─────┘ ┴
typ ─┘ └┘┴ └─────┘ ┴ └─────┘ ┴ └─────┘ ┴ ┴ ┴
doc ─┘ └┘ └─────┘ └─────┘ └─────┘
txt ─┘
par ─┘
pid ─┘
st ─┘
72 is_pell_norm.2 (by simp [mul_comm, mul_left_comm,
id └──────────┘┴ └──────┘ └───────────┘
src └──────────┘┴ └────┘└──────┘└┘└───────────┘└─
typ └──────────┘┴ └────┘└──────┘└┘└───────────┘└─
doc └────┘ └┘ └─
txt └────┘ └┘ └─
par └────┘ └┘ └─
pid ┴┴ └┘ └─
st └───────────────────────────────
73 zsqrtd.conj_mul, pell.is_pell_norm.1 hb, pell.is_pell_norm.1 hc])
id └─────────────┘ └┘ └┘
src ───┘└─────────────┘└┘ └─┘ └┘ └─┘ ┴
typ ───┘└─────────────┘└┘ └─┘└┘└┘ └─┘└┘┴
doc ───┘ └┘ └─┘ └┘ └─┘ ┴
txt ───┘ └┘ └─┘ └┘ └─┘ ┴
par ───┘ └┘ └─┘ └┘ └─┘ ┴
pid ───┘ └┘ └─┘ └┘ └─┘ ┴
st ───────────────────────────────────────────────────────────────────┘
74
75 theorem is_pell_conj : ∀ {b : ℤ√d}, is_pell b ↔ is_pell b.conj | ⟨x, y⟩ :=
id ┴ └┘┴ └─────┘ ┴ ┴ └─────┘ ┴└───┘
src └┘┴ └─────┘ ┴ └─────┘ └───┘
typ ┴ └┘┴ └─────┘ ┴ ┴ └─────┘ ┴└───┘
doc └┘ └─────┘ └─────┘ └───┘
76 by simp [is_pell, zsqrtd.conj]
id └─────┘ └─────────┘
src └────┘└─────┘└┘└─────────┘└─
typ └────┘└─────┘└┘└─────────┘└─
doc └────┘└─────┘└┘└─────────┘└─
txt └────┘ └┘ └─
par └────┘ └┘ └─
pid ┴┴ └┘ ┴└
st └────────────────────────────
77
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
78 @[simp] theorem pell_zd_succ (n : ℕ) : pell_zd (n+1) = pell_zd n * ⟨a, 1⟩ :=
id ┴ └─────┘ ┴┴ ┴ └─────┘ ┴ ┴ ┴
src ─┘ ┴ └─────┘ ┴ ┴ └─────┘ ┴
typ ─┘ ┴ └─────┘ ┴┴ ┴ └─────┘ ┴ ┴ ┴
doc ─┘ └──┘ └─────┘ └─────┘
txt ─┘
par ─┘
pid ─┘
st ─┘
79 by simp [zsqrtd.ext]
id └────────┘
src └────┘└────────┘└─
typ └────┘└────────┘└─
doc └────┘ └─
txt └────┘ └─
par └────┘ └─
pid ┴┴ ┴└
st └──────────────────
80
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
81 theorem is_pell_one : is_pell ⟨a, 1⟩ :=
id └─────┘ ┴
src ─┘ └─────┘
typ ─┘ └─────┘ ┴
doc ─┘ └─────┘
txt ─┘
par ─┘
pid ─┘
st ─┘
82 show az*az-d*1*1=1, by simp [dz_val]
id └┘┴└┘┴┴┴ ┴ ┴ └────┘
src └┘┴└┘┴┴┴ ┴ ┴ └────┘└────┘└─
typ └┘┴└┘┴┴┴ ┴ ┴ └────┘└────┘└─
doc └────┘ └─
txt └────┘ └─
par └────┘ └─
pid ┴┴ ┴└
st └──────────────
83
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
84 theorem is_pell_pell_zd : ∀ (n : ℕ), is_pell (pell_zd n)
id ┴ ┴ └─────┘ └─────┘ ┴
src ─┘ ┴ └─────┘ └─────┘
typ ─┘ ┴ ┴ └─────┘ └─────┘ ┴
doc ─┘ └─────┘ └─────┘
txt ─┘
par ─┘
pid ─┘
st ─┘
85 | 0 := rfl
id └─┘
src └─┘
typ └─┘
86 | (n+1) := let o := is_pell_one in by simp; exact pell.is_pell_mul (is_pell_pell_zd n) o
id ┴ ┴ └─────────┘ └─────────────┘ ┴ ┴
src ┴ └─────────┘ └──┘ └────┘ ┴ ┴ └┘ └
typ ┴ ┴ └─────────┘ └──┘ └────┘ ┴ └─────────────┘┴┴└┘┴└
doc └──┘ └────┘ ┴ ┴ └┘ └
txt └──┘ └────┘ ┴ ┴ └┘ └
par └──┘ └────┘ ┴ ┴ └┘ └
pid ┴ ┴ ┴ └┘ └
st └───────────────────────────────────────────────────
87
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
88 @[simp] theorem pell_eqz (n : ℕ) : xz n * xz n - d * yz n * yz n = 1 := is_pell_pell_zd n
id ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └─────────────┘ ┴
src ─┘ ┴ └┘ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └┘ ┴ └─────────────┘
typ ─┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └─────────────┘ ┴
doc ─┘ └──┘
txt ─┘
par ─┘
pid ─┘
st ─┘
89
90 @[simp] theorem pell_eq (n : ℕ) : xn n * xn n - d * yn n * yn n = 1 :=
id ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴
src ┴ └┘ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └┘ ┴
typ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴
doc └──┘ └┘ └┘ └┘ └┘
91 let pn := pell_eqz n in
id └┘ └──────┘ ┴
src └──────┘
typ └┘ └──────┘ ┴
92 have h : (↑(xn n * xn n) : ℤ) - ↑(d * yn n * yn n) = 1,
id ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴
src ┴ └┘ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └┘ ┴
typ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴
doc └┘ └┘ └┘ └┘
93 by repeat {rw int.coe_nat_mul}; exact pn,
id └─────────────┘ └┘
src └──────┘└─┘└─────────────┘┴ └────┘
typ └──────┘└─┘└─────────────┘┴ └────┘└┘
doc └──────┘└─┘ ┴ └────┘
txt └──────┘└─┘ ┴ └────┘
par └──────┘└─┘ ┴ └────┘
pid └───┘ ┴ ┴
st └─────────────────────────┘└┘└───────┘
94 have hl : d * yn n * yn n ≤ xn n * xn n, from
id ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc └┘ └┘ └┘ └┘
95 int.le_of_coe_nat_le_coe_nat $ int.le.intro $ add_eq_of_eq_sub' $ eq.symm h,
id └──────────────────────────┘ └──────────┘ └───────────────┘ └─────┘ ┴
src └──────────────────────────┘ └──────────┘ └───────────────┘ └─────┘
typ └──────────────────────────┘ └──────────┘ └───────────────┘ └─────┘ ┴
96 int.coe_nat_inj (by rw int.coe_nat_sub hl; exact h)
id └─────────────┘ └─────────────┘ └┘ ┴
src └─────────────┘ └─┘└─────────────┘┴ └────┘
typ └─────────────┘ └─┘└─────────────┘┴└┘ └────┘┴
doc └─┘ ┴ └────┘
txt └─┘ ┴ └────┘
par └─┘ ┴ └────┘
pid ┴ ┴ ┴
st └─────────────────────────────┘
97
98 instance dnsq : zsqrtd.nonsquare d := ⟨λn h,
id └──────────────┘ ┴ ┴ ┴
src └──────────────┘ ┴
typ └──────────────┘ ┴ ┴ ┴
doc └──────────────┘
99 have n*n + 1 = a*a, by rw ← h; exact nat.succ_pred_eq_of_pos (asq_pos a1),
id ┴┴┴ ┴ ┴ ┴┴┴ ┴ └─────────────────────┘ └─────┘ └┘
src ┴ ┴ ┴ ┴ └───┘ └────┘└─────────────────────┘┴ └─────┘┴ ┴
typ ┴┴┴ ┴ ┴ ┴┴┴ └───┘┴ └────┘└─────────────────────┘┴ └─────┘┴└┘┴
doc └───┘ └────┘ ┴ ┴ ┴
txt └───┘ └────┘ ┴ ┴ ┴
par └───┘ └────┘ ┴ ┴ ┴
pid └─┘ ┴ ┴ ┴ ┴
st └─────────────────────────────────────────────────┘
100 have na : n < a, from nat.mul_self_lt_mul_self_iff.2 (by rw ← this; exact nat.lt_succ_self _),
id ┴ ┴ ┴ └──────────────────────────┘┴ └──┘ └──────────────┘
src ┴ └──────────────────────────┘┴ └───┘ └────┘└──────────────┘└┘
typ ┴ ┴ ┴ └──────────────────────────┘┴ └───┘└──┘ └────┘└──────────────┘└┘
doc └───┘ └────┘ └┘
txt └───┘ └────┘ └┘
par └───┘ └────┘ └┘
pid └─┘ ┴ └┘
st └──────────────────────────────────┘
101 have (n+1)*(n+1) ≤ n*n + 1, by rw this; exact nat.mul_self_le_mul_self na,
id ┴┴ ┴ ┴┴ ┴ ┴┴┴ ┴ └──┘ └──────────────────────┘ └┘
src ┴ ┴ ┴ ┴ ┴ ┴ └─┘ └────┘└──────────────────────┘┴
typ ┴┴ ┴ ┴┴ ┴ ┴┴┴ ┴ └─┘└──┘ └────┘└──────────────────────┘┴└┘
doc └─┘ └────┘ ┴
txt └─┘ └────┘ ┴
par └─┘ └────┘ ┴
pid ┴ ┴ ┴
st └─────────────────────────────────────────┘
102 have n+n ≤ 0, from @nat.le_of_add_le_add_right (n*n + 1) _ _ (by simpa [mul_add, mul_comm, mul_left_comm]),
id ┴┴┴ ┴ └────────────────────────┘ ┴┴┴ ┴ └─────┘ └──────┘ └───────────┘
src ┴ ┴ └────────────────────────┘ ┴ ┴ └─────┘└─────┘└┘└──────┘└┘└───────────┘┴
typ ┴┴┴ ┴ └────────────────────────┘ ┴┴┴ ┴ └─────┘└─────┘└┘└──────┘└┘└───────────┘┴
doc └─────┘ └┘ └┘ ┴
txt └─────┘ └┘ └┘ ┴
par └─────┘ └┘ └┘ ┴
pid ┴┴ └┘ └┘ ┴
st └───────────────────────────────────────┘
103 ne_of_gt d_pos $ by rw nat.eq_zero_of_le_zero (le_trans (nat.le_add_left _ _) this) at h; exact h⟩
id └──────┘ └───┘ └────────────────────┘ └──────┘ └─────────────┘ └──┘ ┴
src └──────┘ └───┘ └─┘└────────────────────┘┴ └──────┘┴ └─────────────┘└────┘ └────┘ └────┘
typ └──────┘ └───┘ └─┘└────────────────────┘┴ └──────┘┴ └─────────────┘└────┘└──┘└────┘ └────┘┴
doc └─┘ ┴ ┴ └────┘ └────┘ └────┘
txt └─┘ ┴ ┴ └────┘ └────┘ └────┘
par └─┘ ┴ ┴ └────┘ └────┘ └────┘
pid ┴ ┴ ┴ └────┘ ┴└───┘ ┴
st └────────────────────────────────────────────────────────────────────────────┘
104
105 theorem xn_ge_a_pow : ∀ (n : ℕ), a^n ≤ xn n
id ┴ ┴ ┴┴┴ ┴ └┘ ┴
src ┴ ┴ ┴ └┘
typ ┴ ┴ ┴┴┴ ┴ └┘ ┴
doc └┘
106 | 0 := le_refl 1
id └─────┘
src └─────┘
typ └─────┘
107 | (n+1) := by simp [nat.pow_succ]; exact le_trans
id ┴ └──────────┘ └──────┘
src ┴ └────┘└──────────┘┴ └────┘└──────┘└
typ ┴ └────┘└──────────┘┴ └────┘└──────┘└
doc └────┘ ┴ └────┘ └
txt └────┘ ┴ └────┘ └
par └────┘ ┴ └────┘ └
pid ┴┴ ┴ ┴ └
st └────────────────────────────────────
108 (nat.mul_le_mul_right _ (xn_ge_a_pow n)) (nat.le_add_right _ _)
id └──────────────────┘ └─────────┘ ┴ └──────────────┘
src ───┘ └──────────────────┘└─┘ ┴ └─┘ └──────────────┘└─────
typ ───┘ └──────────────────┘└─┘ └─────────┘┴┴└─┘ └──────────────┘└─────
doc ───┘ └─┘ ┴ └─┘ └─────
txt ───┘ └─┘ ┴ └─┘ └─────
par ───┘ └─┘ ┴ └─┘ └─────
pid ───┘ └─┘ ┴ └─┘ └───┘└
st ────────────────────────────────────────────────────────────────────
109
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
110 theorem n_lt_a_pow : ∀ (n : ℕ), n < a^n
id ┴ ┴ ┴ ┴ ┴┴┴
src ─┘ ┴ ┴ ┴
typ ─┘ ┴ ┴ ┴ ┴ ┴┴┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
111 | 0 := nat.le_refl 1
id └─────────┘
src └─────────┘
typ └─────────┘
112 | (n+1) := begin have IH := n_lt_a_pow n,
id ┴ └────────┘ ┴
src ┴ └─────────┘ ┴
typ ┴ └─────────┘└────────┘┴┴
doc └─────────┘ ┴
txt └─────────┘ ┴
par └─────────┘ ┴
pid └─────┘┴└─┘ ┴
st └───────────────────────────┘└─
113 have : a^n + a^n ≤ a^n * a,
id ┴ ┴ ┴ ┴ ┴ ┴
src └─────┘ ┴ ┴┴┴ ┴┴┴ ┴┴┴
typ └─────┘ ┴ ┴┴┴ ┴┴┴ ┴┴┴┴┴
doc └─────┘ ┴ ┴ ┴ ┴ ┴ ┴
txt └─────┘ ┴ ┴ ┴ ┴ ┴ ┴
par └─────┘ ┴ ┴ ┴ ┴ ┴ ┴
pid └───┘└┘ ┴ ┴ ┴ ┴ ┴ ┴
st ─────────────────────────────┘└─
114 { rw ← mul_two, exact nat.mul_le_mul_left _ a1 },
id └─────┘ └─────────────────┘ └┘
src └───┘└─────┘ └────┘└─────────────────┘└─┘ ┴
typ └───┘└─────┘ └────┘└─────────────────┘└─┘└┘┴
doc └───┘ └────┘ └─┘ ┴
txt └───┘ └────┘ └─┘ ┴
par └───┘ └────┘ └─┘ ┴
pid └─┘ ┴ └─┘ ┴
st ─────┘└──────────┘└───────────────────────────────┘└┘└
115 simp [nat.pow_succ], refine lt_of_lt_of_le _ this,
id └──────────┘ └────────────┘ └──┘
src └────┘└──────────┘┴ └─────┘└────────────┘└─┘
typ └────┘└──────────┘┴ └─────┘└────────────┘└─┘└──┘
doc └────┘ ┴ └─────┘ └─┘
txt └────┘ ┴ └─────┘ └─┘
par └────┘ ┴ └─────┘ └─┘
pid ┴┴ ┴ ┴ └─┘
st ──────────────────────┘└────────────────────────────┘└─
116 exact add_lt_add_of_lt_of_le IH (lt_of_le_of_lt (nat.zero_le _) IH)
id └────────────────────┘ └────────────┘ └─────────┘ └┘
src └────┘└────────────────────┘┴ ┴ └────────────┘┴ └─────────┘└──┘ └─
typ └────┘└────────────────────┘┴ ┴ └────────────┘┴ └─────────┘└──┘└┘└─
doc └────┘ ┴ ┴ ┴ └──┘ └─
txt └────┘ ┴ ┴ ┴ └──┘ └─
par └────┘ ┴ ┴ ┴ └──┘ └─
pid ┴ ┴ ┴ ┴ └──┘ ┴└
st ────────────────────────────────────────────────────────────────────────
117 end
src ─┘
typ ─┘
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘└─┘
118
119 theorem n_lt_xn (n) : n < xn n :=
id ┴ ┴ └┘ ┴
src ┴ └┘
typ ┴ ┴ └┘ ┴
doc └┘
120 lt_of_lt_of_le (n_lt_a_pow n) (xn_ge_a_pow n)
id └────────────┘ └────────┘ ┴ └─────────┘ ┴
src └────────────┘ └────────┘ └─────────┘
typ └────────────┘ └────────┘ ┴ └─────────┘ ┴
121
122 theorem x_pos (n) : xn n > 0 :=
id └┘ ┴ ┴
src └┘ ┴
typ └┘ ┴ ┴
doc └┘
123 lt_of_le_of_lt (nat.zero_le n) (n_lt_xn n)
id └────────────┘ └─────────┘ ┴ └─────┘ ┴
src └────────────┘ └─────────┘ └─────┘
typ └────────────┘ └─────────┘ ┴ └─────┘ ┴
124
125 lemma eq_pell_lem : ∀n (b:ℤ√d), 1 ≤ b → is_pell b → pell_zd n ≥ b → ∃n, b = pell_zd n
id ┴ └┘┴ ┴ ┴ └─────┘ ┴ └─────┘ ┴ ┴ ┴ ┴┴┴ ┴ ┴ └─────┘ ┴
src └┘┴ ┴ └─────┘ └─────┘ ┴ ┴ ┴ ┴ └─────┘
typ ┴ └┘┴ ┴ ┴ └─────┘ ┴ └─────┘ ┴ ┴ ┴ ┴┴┴ ┴ ┴ └─────┘ ┴
doc └┘ └─────┘ └─────┘ └─────┘
126 | 0 b := λh1 hp hl, ⟨0, @zsqrtd.le_antisymm _ dnsq _ _ hl h1⟩
id └┘ └┘ └┘ └────────────────┘ └──┘ └┘ └┘
src └────────────────┘ └──┘
typ └┘ └┘ └┘ └────────────────┘ └──┘ └┘ └┘
127 | (n+1) b := λh1 hp h,
id ┴┴ ┴ └┘ └┘ ┴
src ┴
typ ┴┴ ┴ └┘ └┘ ┴
128 have a1p : (0:ℤ√d) ≤ ⟨a, 1⟩, from trivial,
id └┘┴ ┴ ┴ └─────┘
src └┘┴ ┴ └─────┘
typ └┘┴ ┴ ┴ └─────┘
doc └┘
129 have am1p : (0:ℤ√d) ≤ ⟨a, -1⟩, from show (_:nat) ≤ _, by simp; exact nat.pred_le _,
id └┘┴ ┴ ┴ ┴ └─┘ ┴ └─────────┘
src └┘┴ ┴ ┴ └─┘ ┴ └──┘ └────┘└─────────┘└┘
typ └┘┴ ┴ ┴ ┴ └─┘ ┴ └──┘ └────┘└─────────┘└┘
doc └┘ └──┘ └────┘ └┘
txt └──┘ └────┘ └┘
par └──┘ └────┘ └┘
pid ┴ └┘
st └────────────────────────┘
130 have a1m : (⟨a, 1⟩ * ⟨a, -1⟩ : ℤ√d) = 1, from is_pell_norm.1 is_pell_one,
id ┴ ┴ ┴ ┴ └┘┴ ┴ └──────────┘┴ └─────────┘
src ┴ ┴ └┘┴ ┴ └──────────┘┴ └─────────┘
typ ┴ ┴ ┴ ┴ └┘┴ ┴ └──────────┘┴ └─────────┘
doc └┘
131 if ha : b ≥ ⟨↑a, 1⟩ then
id └┘ ┴ ┴┴
src └┘ ┴ ┴
typ └┘ ┴ ┴┴
132 let ⟨m, e⟩ := eq_pell_lem n (b * ⟨a, -1⟩)
id └─┘ ┴ └─────────┘ ┴ ┴ ┴
src ┴ ┴
typ └─┘ ┴ └─────────┘ ┴ ┴ ┴
133 (by rw ← a1m; exact mul_le_mul_of_nonneg_right ha am1p)
id └─┘ └────────────────────────┘ └┘ └──┘
src └───┘ └────┘└────────────────────────┘┴ ┴
typ └───┘└─┘ └────┘└────────────────────────┘┴└┘┴└──┘
doc └───┘ └────┘ ┴ ┴
txt └───┘ └────┘ ┴ ┴
par └───┘ └────┘ ┴ ┴
pid └─┘ ┴ ┴ ┴
st └─────────────────────────────────────────────────┘
134 (is_pell_mul hp (is_pell_conj.1 is_pell_one))
id └─────────┘ └┘ └──────────┘┴ └─────────┘
src └─────────┘ └──────────┘┴ └─────────┘
typ └─────────┘ └┘ └──────────┘┴ └─────────┘
135 (by have t := mul_le_mul_of_nonneg_right h am1p; rwa [pell_zd_succ, mul_assoc, a1m, mul_one] at t) in
id └────────────────────────┘ ┴ └──┘ └──────────┘ └───────┘ └─┘ └─────┘
src └────────┘└────────────────────────┘┴ ┴ └───┘└──────────┘└┘└───────┘└┘ └┘└─────┘└────┘
typ └────────┘└────────────────────────┘┴┴┴└──┘ └───┘└──────────┘└┘└───────┘└┘└─┘└┘└─────┘└────┘
doc └────────┘ ┴ ┴ └───┘ └┘ └┘ └┘ └────┘
txt └────────┘ ┴ ┴ └───┘ └┘ └┘ └┘ └────┘
par └────────┘ ┴ ┴ └───┘ └┘ └┘ └┘ └────┘
pid └────┘┴└─┘ ┴ ┴ └┘ └┘ └┘ └┘ ┴└───┘
st └─────────────────────────────────────────────────┘└──────────┘└─────────┘└───┘└───────┘┴└───┘
136 ⟨m+1, by rw [show b = b * ⟨a, -1⟩ * ⟨a, 1⟩, by rw [mul_assoc, eq.trans (mul_comm _ _) a1m]; simp, pell_zd_succ, e]⟩
id ┴ ┴ ┴ ┴ ┴ ┴ └───────┘ └──────┘ └──────┘ └─┘ └──────────┘ ┴
src ┴ └──┘ ┴ ┴┴┴ ┴┴┴ └┘┴└─┘ ┴ └───────────┘└───────┘└┘└──────┘┴ └──────┘└────┘ └─┘└──┘└┘└──────────┘└┘ ┴
typ ┴ └──┘ ┴ ┴┴┴┴┴┴┴ └┘┴└─┘ ┴ ┴└───────────┘└───────┘└┘└──────┘┴ └──────┘└────┘└─┘└─┘└──┘└┘└──────────┘└┘┴┴
doc └──┘ ┴ ┴ ┴ ┴ ┴ └┘ └─┘ ┴ └───────────┘ └┘ ┴ └────┘ └─┘└──┘└┘ └┘ ┴
txt └──┘ ┴ ┴ ┴ ┴ ┴ └┘ └─┘ ┴ └───────────┘ └┘ ┴ └────┘ └─┘└──┘└┘ └┘ ┴
par └──┘ ┴ ┴ ┴ ┴ ┴ └┘ └─┘ ┴ └───────────┘ └┘ ┴ └────┘ └─┘└──┘└┘ └┘ ┴
pid └┘ ┴ ┴ ┴ ┴ ┴ └┘ └─┘ ┴ └───────────┘ └┘ ┴ └────┘ └───────┘ └┘ ┴
st └────────────────────────────────────┘└────────────┘└───────────────────────────┘┴└────┘└────────────┘└─┘┴
137 else
138 suffices ¬1 < b, from ⟨0, show b = 1, from (or.resolve_left (lt_or_eq_of_le h1) this).symm⟩, λh1l,
id └──────┘ ┴ ┴ ┴ └─────────────┘ └────────────┘ └┘ └──┘ └──┘ └─┘
src └──────┘ ┴ ┴ ┴ └─────────────┘ └────────────┘ └──┘
typ └──────┘ ┴ ┴ ┴ └─────────────┘ └────────────┘ └┘ └──┘ └──┘ └─┘
139 by cases b with x y; exact
id ┴
src └────┘ └───────┘ └─────
typ └────┘┴└───────┘ └─────
doc └────┘ └───────┘ └─────
txt └────┘ └───────┘ └─────
par └────┘ └───────┘ └─────
pid ┴ └───────┘ └
st └────────────────────────
140 have bm : (_*⟨_,_⟩ :ℤ√(d a1)) = 1, from pell.is_pell_norm.1 hp,
id └┘
src ─────┘ └────┘ ┴ └────┘ ┴ └─┘ └───────┘ └─┘ └─
typ ─────┘ └────┘ ┴ └────┘ ┴ └─┘ └───────┘ └─┘└┘└─
doc ─────┘ └────┘ ┴ └────┘ ┴ └─┘ └───────┘ └─┘ └─
txt ─────┘ └────┘ ┴ └────┘ ┴ └─┘ └───────┘ └─┘ └─
par ─────┘ └────┘ ┴ └────┘ ┴ └─┘ └───────┘ └─┘ └─
pid ─────┘ └────┘ ┴ └────┘ ┴ └─┘ └───────┘ └─┘ └─
st ──────────────────────────────────────────────────────────────────────
141 have y0l : (0:ℤ√(d a1)) < ⟨x - x, y - -y⟩, from sub_lt_sub h1l $ λ(hn : (1:ℤ√(d a1)) ≤ ⟨x, -y⟩),
id ┴ ┴ └────────┘ └─┘ ┴ └┘ ┴ ┴ ┴
src ─────┘ └─────┘ └┘ ┴ └─┘┴┴ ┴┴┴ └┘ ┴ ┴ └──────┘└────────┘┴ ┴ ┴ └────┘ └┘ ┴┴ └─┘ ┴ └┘ └───
typ ─────┘ └─────┘ └┘ ┴ └─┘┴┴ ┴┴┴ └┘ ┴ ┴ └──────┘└────────┘┴└─┘┴ ┴ └────┘ └┘ ┴┴└┘└─┘┴┴ ┴└┘ ┴└───
doc ─────┘ └─────┘ └┘ ┴ └─┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────┘ ┴ ┴ ┴ └────┘ └┘ ┴ └─┘ ┴ └┘ └───
txt ─────┘ └─────┘ └┘ ┴ └─┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────┘ ┴ ┴ ┴ └────┘ └┘ ┴ └─┘ ┴ └┘ └───
par ─────┘ └─────┘ └┘ ┴ └─┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────┘ ┴ ┴ ┴ └────┘ └┘ ┴ └─┘ ┴ └┘ └───
pid ─────┘ └─────┘ └┘ ┴ └─┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────┘ ┴ ┴ ┴ └────┘ └┘ ┴ └─┘ ┴ └┘ └───
st ───────────────────────────────────────────────────────────────────────────────────────────────────────
142 by have t := mul_le_mul_of_nonneg_left hn (le_trans zero_le_one h1); rw [bm, mul_one] at t; exact h1l t,
id └───────────────────────┘ └┘ └──────┘ └─────────┘ └┘ └┘ └─────┘ └─┘ ┴
src ───────┘ ┴└────────┘└───────────────────────┘┴ ┴ └──────┘┴└─────────┘┴ ┴└┘└──┘ └┘└─────┘└────┘└──────┘ ┴ └─
typ ───────┘ ┴└────────┘└───────────────────────┘┴└┘┴ └──────┘┴└─────────┘┴└┘┴└┘└──┘└┘└┘└─────┘└────┘└──────┘└─┘┴┴└─
doc ───────┘ ┴└────────┘ ┴ ┴ ┴ ┴ ┴└┘└──┘ └┘ └────┘└──────┘ ┴ └─
txt ───────┘ ┴└────────┘ ┴ ┴ ┴ ┴ ┴└┘└──┘ └┘ └────┘└──────┘ ┴ └─
par ───────┘ ┴└────────┘ ┴ ┴ ┴ ┴ ┴└┘└──┘ └┘ └────┘└──────┘ ┴ └─
pid ───────┘ └─────────┘ ┴ ┴ ┴ ┴ └─────┘ └┘ └────────────┘ ┴ └─
st ─────────┘└─────────────────────────────────────────────────────────────────────┘└┘└───────┘┴└────────────────┘└─
143 have yl2 : (⟨_, _⟩ : ℤ√_) < ⟨_, _⟩, from
src ─────┘ └─────┘ └──────┘ └─┘ ┴ └───────────
typ ─────┘ └─────┘ └──────┘ └─┘ ┴ └───────────
doc ─────┘ └─────┘ └──────┘ └─┘ ┴ └───────────
txt ─────┘ └─────┘ └──────┘ └─┘ ┴ └───────────
par ─────┘ └─────┘ └──────┘ └─┘ ┴ └───────────
pid ─────┘ └─────┘ └──────┘ └─┘ ┴ └───────────
st ───────────────────────────────────────────────
144 show (⟨x, y⟩ - ⟨x, -y⟩ : ℤ√(d a1)) < ⟨a, 1⟩ - ⟨a, -1⟩, from
id ┴
src ───────┘ ┴ └┘ └┘ ┴ └┘ └──┘ ┴ └─┘ ┴ └───┘ ┴ └┘ └────────
typ ───────┘ ┴ └┘ └┘ ┴ └┘ └──┘ ┴ └─┘┴┴ └───┘ ┴ └┘ └────────
doc ───────┘ ┴ └┘ └┘ ┴ └┘ └──┘ ┴ └─┘ ┴ └───┘ ┴ └┘ └────────
txt ───────┘ ┴ └┘ └┘ ┴ └┘ └──┘ ┴ └─┘ ┴ └───┘ ┴ └┘ └────────
par ───────┘ ┴ └┘ └┘ ┴ └┘ └──┘ ┴ └─┘ ┴ └───┘ ┴ └┘ └────────
pid ───────┘ ┴ └┘ └┘ ┴ └┘ └──┘ ┴ └─┘ ┴ └───┘ ┴ └┘ └────────
st ────────────────────────────────────────────────────────────────────
145 sub_lt_sub (by exact ha) $ λ(hn : (⟨x, -y⟩ : ℤ√(d a1)) ≤ ⟨a, -1⟩),
id └┘ ┴ ┴
src ───────┘ ┴ └─────┘ └┘ ┴ └────┘ └┘ └──┘ ┴ └─┘┴┴ └┘ └────
typ ───────┘ ┴ └─────┘└┘└┘ ┴ └────┘ └┘ └──┘ ┴ └─┘┴┴ ┴└┘ └────
doc ───────┘ ┴ └─────┘ └┘ ┴ └────┘ └┘ └──┘ ┴ └─┘ ┴ └┘ └────
txt ───────┘ ┴ └─────┘ └┘ ┴ └────┘ └┘ └──┘ ┴ └─┘ ┴ └┘ └────
par ───────┘ ┴ └─────┘ └┘ ┴ └────┘ └┘ └──┘ ┴ └─┘ ┴ └┘ └────
pid ───────┘ ┴ └─────┘ └┘ ┴ └────┘ └┘ └──┘ ┴ └─┘ ┴ └┘ └────
st ─────────────────────┘└───────┘└───────────────────────────────────────────
146 by have t := mul_le_mul_of_nonneg_right (mul_le_mul_of_nonneg_left hn (le_trans zero_le_one h1)) a1p;
id └────────────────────────┘ └───────────────────────┘ └┘ └──────┘ └─────────┘ └┘ └─┘
src ───────┘ ┴└────────┘└────────────────────────┘┴ └───────────────────────┘┴ ┴ └──────┘┴└─────────┘┴ └─┘ └─
typ ───────┘ ┴└────────┘└────────────────────────┘┴ └───────────────────────┘┴└┘┴ └──────┘┴└─────────┘┴└┘└─┘└─┘└─
doc ───────┘ ┴└────────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └─
txt ───────┘ ┴└────────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └─
par ───────┘ ┴└────────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └─
pid ───────┘ └─────────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └─
st ─────────┘└───────────────────────────────────────────────────────────────────────────────────────────────────
147 rw [bm, one_mul, mul_assoc, eq.trans (mul_comm _ _) a1m, mul_one] at t; exact ha t,
id └┘ └─────┘ └───────┘ └──────┘ └──────┘ └─┘ └─────┘ └┘ ┴
src ──────────┘└──┘ └┘└─────┘└┘└───────┘└┘└──────┘┴ └──────┘└────┘ └┘└─────┘└────┘└──────┘ ┴ └─
typ ──────────┘└──┘└┘└┘└─────┘└┘└───────┘└┘└──────┘┴ └──────┘└────┘└─┘└┘└─────┘└────┘└──────┘└┘┴┴└─
doc ──────────┘└──┘ └┘ └┘ └┘ ┴ └────┘ └┘ └────┘└──────┘ ┴ └─
txt ──────────┘└──┘ └┘ └┘ └┘ ┴ └────┘ └┘ └────┘└──────┘ ┴ └─
par ──────────┘└──┘ └┘ └┘ └┘ ┴ └────┘ └┘ └────┘└──────┘ ┴ └─
pid ──────────────┘ └┘ └┘ └┘ ┴ └────┘ └┘ └────────────┘ ┴ └─
st ──────────────┘└┘└───────┘└─────────┘└───────────────────────────┘└───────┘┴└───────────────┘└─
148 by simp at y0l; simp at yl2; exact
src ─────┘ ┴└─────────┘└┘└─────────┘└───────
typ ─────┘ ┴└─────────┘└┘└─────────┘└───────
doc ─────┘ ┴└─────────┘└┘└─────────┘└───────
txt ─────┘ ┴└─────────┘└┘└─────────┘└───────
par ─────┘ ┴└─────────┘└┘└─────────┘└───────
pid ─────┘ └────────────────────────────────
st ───────┘└────────────────────────────────
149 match y, y0l, (yl2 : (⟨_, _⟩ : ℤ√_) < ⟨_, _⟩) with
id ┴ └─┘ └─┘
src ─────┘ ┴ └┘ └┘ └─┘ └──────┘ └─┘ ┴ └───────────
typ ─────┘ ┴┴└┘└─┘└┘ └─┘└─┘ └──────┘ └─┘ ┴ └───────────
doc ─────┘ ┴ └┘ └┘ └─┘ └──────┘ └─┘ ┴ └───────────
txt ─────┘ ┴ └┘ └┘ └─┘ └──────┘ └─┘ ┴ └───────────
par ─────┘ ┴ └┘ └┘ └─┘ └──────┘ └─┘ ┴ └───────────
pid ─────┘ ┴ └┘ └┘ └─┘ └──────┘ └─┘ ┴ └───────────
st ─────────────────────────────────────────────────────────
150 | 0, y0l, yl2 := y0l (le_refl 0)
id └─┘
src ──────────┘ └┘ └──┘ ┴ └───
typ ──────────┘└─┘└┘ └──┘ ┴ └───
doc ──────────┘ └┘ └──┘ ┴ └───
txt ──────────┘ └┘ └──┘ ┴ └───
par ──────────┘ └┘ └──┘ ┴ └───
pid ──────────┘ └┘ └──┘ ┴ └───
st ───────────────────────────────────────
151 | (y+1 : ℕ), y0l, yl2 := yl2 (zsqrtd.le_of_le_le (le_refl 0)
id ┴┴ └─┘ └────────────────┘ └─────┘
src ───────┘ ┴└──┘ └─┘ └┘ └──┘ ┴ └────────────────┘┴ └─────┘└───
typ ───────┘ ┴┴└──┘ └─┘ └┘└─┘└──┘ ┴ └────────────────┘┴ └─────┘└───
doc ───────┘ └──┘ └─┘ └┘ └──┘ ┴ ┴ └───
txt ───────┘ └──┘ └─┘ └┘ └──┘ ┴ ┴ └───
par ───────┘ └──┘ └─┘ └┘ └──┘ ┴ ┴ └───
pid ───────┘ └──┘ └─┘ └┘ └──┘ ┴ ┴ └───
st ───────────────────────────────────────────────────────────────────
152 (let t := int.coe_nat_le_coe_nat_of_le (nat.succ_pos y) in add_le_add t t))
id └──────────────────────────┘ └──────────┘ └────────┘
src ─────────┘ └────┘└──────────────────────────┘┴ └──────────┘┴ └───┘└────────┘┴ ┴ └──
typ ─────────┘ └────┘└──────────────────────────┘┴ └──────────┘┴ └───┘└────────┘┴ ┴ └──
doc ─────────┘ └────┘ ┴ ┴ └───┘ ┴ ┴ └──
txt ─────────┘ └────┘ ┴ ┴ └───┘ ┴ ┴ └──
par ─────────┘ └────┘ ┴ ┴ └───┘ ┴ ┴ └──
pid ─────────┘ └────┘ ┴ ┴ └───┘ ┴ ┴ └──
st ──────────────────────────────────────────────────────────────────────────────────────
153 | -[1+y], y0l, yl2 := y0l trivial
id └─┘ └─────┘
src ───────┘ └┘ └┘ └──┘ ┴└─────┘└
typ ───────┘ └┘└─┘└┘ └──┘ ┴└─────┘└
doc ───────┘ └┘ └┘ └──┘ ┴ └
txt ───────┘ └┘ └┘ └──┘ ┴ └
par ───────┘ └┘ └┘ └──┘ ┴ └
pid ───────┘ └┘ └┘ └──┘ ┴ └
st ────────────────────────────────────────
154 end
src ──────────
typ ──────────
doc ──────────
txt ──────────
par ──────────
pid ──────────
st ──────────
155
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
156 theorem eq_pell_zd (b : ℤ√d) (b1 : 1 ≤ b) (hp : is_pell b) : ∃n, b = pell_zd n :=
id └┘┴ ┴ ┴ └─────┘ ┴ ┴┴┴ ┴ ┴ └─────┘ ┴
src ─┘ └┘┴ ┴ └─────┘ ┴ ┴ ┴ └─────┘
typ ─┘ └┘┴ ┴ ┴ └─────┘ ┴ ┴┴┴ ┴ ┴ └─────┘ ┴
doc ─┘ └┘ └─────┘ └─────┘
txt ─┘
par ─┘
pid ─┘
st ─┘
157 let ⟨n, h⟩ := @zsqrtd.le_arch d b in
id └─┘ ┴ ┴ └────────────┘ ┴ ┴
src └────────────┘ ┴
typ └─┘ ┴ ┴ └────────────┘ ┴ ┴
158 eq_pell_lem n b b1 hp $ zsqrtd.le_trans h $ by rw zsqrtd.coe_nat_val; exact
id └─────────┘ ┴ └┘ └┘ └─────────────┘ └────────────────┘
src └─────────┘ └─────────────┘ └─┘└────────────────┘ └─────
typ └─────────┘ ┴ └┘ └┘ └─────────────┘ └─┘└────────────────┘ └─────
doc └─┘ └─────
txt └─┘ └─────
par └─┘ └─────
pid ┴ └
st └─────────────────────────────
159 zsqrtd.le_of_le_le
id └────────────────┘
src ─┘└────────────────┘└
typ ─┘└────────────────┘└
doc ─┘ └
txt ─┘ └
par ─┘ └
pid ─┘ └
st ─────────────────────
160 (int.coe_nat_le_coe_nat_of_le $ le_of_lt $ n_lt_xn _ _) (int.coe_zero_le _)
id └──────────────────────────┘ └──────┘ └─────┘ └─────────────┘
src ───┘ └──────────────────────────┘┴ ┴└──────┘┴ ┴└─────┘└────┘ └─────────────┘└───
typ ───┘ └──────────────────────────┘┴ ┴└──────┘┴ ┴└─────┘└────┘ └─────────────┘└───
doc ───┘ ┴ ┴ ┴ ┴ └────┘ └───
txt ───┘ ┴ ┴ ┴ ┴ └────┘ └───
par ───┘ ┴ ┴ ┴ ┴ └────┘ └───
pid ───┘ ┴ ┴ ┴ ┴ └────┘ └─┘└
st ────────────────────────────────────────────────────────────────────────────────
161
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
162 theorem eq_pell {x y : ℕ} (hp : x*x - d*y*y = 1) : ∃n, x = xn n ∧ y = yn n :=
id ┴ ┴┴┴ ┴ ┴┴┴┴┴ ┴ ┴┴┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴
src ─┘ ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘
typ ─┘ ┴ ┴┴┴ ┴ ┴┴┴┴┴ ┴ ┴┴┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
163 have (1:ℤ√d) ≤ ⟨x, y⟩, from match x, hp with
id └┘┴ ┴ ┴ ┴ ┴ └┘
src └┘┴ ┴
typ └┘┴ ┴ ┴ ┴ ┴ └┘
doc └┘
164 | 0, (hp : 0 - _ = 1) := by rw nat.zero_sub at hp; contradiction
id ┴ ┴ └──────────┘
src ┴ ┴ └─┘└──────────┘└────┘ └─────────────
typ ┴ ┴ └─┘└──────────┘└────┘ └─────────────
doc └─┘ └────┘ └─────────────
txt └─┘ └────┘ └─────────────
par └─┘ └────┘ └─────────────
pid ┴ └────┘ └
st └─────────────────────────────────────
165 | (x+1), hp := zsqrtd.le_of_le_le (int.coe_nat_le_coe_nat_of_le $ nat.succ_pos x) (int.coe_zero_le _)
id ┴┴ └────────────────┘ └──────────────────────────┘ └──────────┘ └─────────────┘
src ─┘ ┴ └────────────────┘ └──────────────────────────┘ └──────────┘ └─────────────┘
typ ─┘ ┴┴ └────────────────┘ └──────────────────────────┘ └──────────┘ └─────────────┘
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
166 end,
167 let ⟨m, e⟩ := eq_pell_zd ⟨x, y⟩ this (is_pell_nat.2 hp) in
id └─┘ ┴ ┴ └────────┘ ┴ ┴ └──┘ └─────────┘┴ └┘
src └────────┘ └─────────┘┴
typ └─┘ ┴ ┴ └────────┘ ┴ ┴ └──┘ └─────────┘┴ └┘
168 ⟨m, match x, y, e with ._, ._, rfl := ⟨rfl, rfl⟩ end⟩
id ┴ ┴ └─┘ └─┘ └─┘
src └─┘ └─┘ └─┘
typ ┴ ┴ └─┘ └─┘ └─┘
169
170 theorem pell_zd_add (m) : ∀ n, pell_zd (m + n) = pell_zd m * pell_zd n
id ┴ └─────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ └─────┘ ┴
src └─────┘ ┴ ┴ └─────┘ ┴ └─────┘
typ ┴ └─────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ └─────┘ ┴
doc └─────┘ └─────┘ └─────┘
171 | 0 := (mul_one _).symm
id └─────┘ └──┘
src └─────┘ └──┘
typ └─────┘ └──┘
172 | (n+1) := by rw[← add_assoc, pell_zd_succ, pell_zd_succ, pell_zd_add n, ← mul_assoc]
id ┴ └───────┘ └──────────┘ └──────────┘ └─────────┘ ┴ └───────┘
src ┴ └───┘└───────┘└┘└──────────┘└┘└──────────┘└┘ ┴ └──┘└───────┘└─
typ ┴ └───┘└───────┘└┘└──────────┘└┘└──────────┘└┘└─────────┘┴┴└──┘└───────┘└─
doc └───┘ └┘ └┘ └┘ ┴ └──┘ └─
txt └───┘ └┘ └┘ └┘ ┴ └──┘ └─
par └───┘ └┘ └┘ └┘ ┴ └──┘ └─
pid └─┘ └┘ └┘ └┘ ┴ └──┘ ┴└
st └─────────────┘└────────────┘└────────────┘└─────────────┘└───────────┘┴└
173
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
174 theorem xn_add (m n) : xn (m + n) = xn m * xn n + d * yn m * yn n :=
id └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └┘
typ ─┘ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘ └┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
175 by injection (pell_zd_add _ m n) with h _;
id └─────────┘ ┴ ┴
src └────────┘ └─────────┘└─┘ ┴ └────────┘
typ └────────┘ └─────────┘└─┘┴┴┴└────────┘
doc └────────┘ └─┘ ┴ └────────┘
txt └────────┘ └─┘ ┴ └────────┘
par └────────┘ └─┘ ┴ └────────┘
pid ┴ └─┘ ┴ ┴└───────┘
st └────────────────────────────────────────
176 repeat {rw ← int.coe_nat_add at h <|> rw ← int.coe_nat_mul at h};
id └─────────────┘ └─────────────┘
src └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘┴
typ └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘┴
doc └──────┘└───┘ └────┘└──┘└───┘ └───┘┴
txt └──────┘└───┘ └────┘└──┘└───┘ └───┘┴
par └──────┘└───┘ └────┘└──┘└───┘ └───┘┴
pid └─────┘ └─────────────┘ └────┘
st ────────────┘└─────────────────────────────────────────────────────┘└┘└
177 exact int.coe_nat_inj h
id └─────────────┘ ┴
src └────┘└─────────────┘┴ └
typ └────┘└─────────────┘┴┴└
doc └────┘ ┴ └
txt └────┘ ┴ └
par └────┘ ┴ └
pid ┴ ┴ └
st ─────────────────────────────
178
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
179 theorem yn_add (m n) : yn (m + n) = xn m * yn n + yn m * xn n :=
id └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ └┘ ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ─┘ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘ └┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
180 by injection (pell_zd_add _ m n) with _ h;
id └─────────┘ ┴ ┴
src └────────┘ └─────────┘└─┘ ┴ └────────┘
typ └────────┘ └─────────┘└─┘┴┴┴└────────┘
doc └────────┘ └─┘ ┴ └────────┘
txt └────────┘ └─┘ ┴ └────────┘
par └────────┘ └─┘ ┴ └────────┘
pid ┴ └─┘ ┴ ┴└───────┘
st └────────────────────────────────────────
181 repeat {rw ← int.coe_nat_add at h <|> rw ← int.coe_nat_mul at h};
id └─────────────┘ └─────────────┘
src └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘┴
typ └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘┴
doc └──────┘└───┘ └────┘└──┘└───┘ └───┘┴
txt └──────┘└───┘ └────┘└──┘└───┘ └───┘┴
par └──────┘└───┘ └────┘└──┘└───┘ └───┘┴
pid └─────┘ └─────────────┘ └────┘
st ────────────┘└─────────────────────────────────────────────────────┘└┘└
182 exact int.coe_nat_inj h
id └─────────────┘ ┴
src └────┘└─────────────┘┴ └
typ └────┘└─────────────┘┴┴└
doc └────┘ ┴ └
txt └────┘ ┴ └
par └────┘ ┴ └
pid ┴ ┴ └
st ─────────────────────────────
183
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
184 theorem pell_zd_sub {m n} (h : n ≤ m) : pell_zd (m - n) = pell_zd m * (pell_zd n).conj :=
id ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ └─────┘ ┴ └──┘
src ─┘ ┴ └─────┘ ┴ ┴ └─────┘ ┴ └─────┘ └──┘
typ ─┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ └─────┘ ┴ └──┘
doc ─┘ └─────┘ └─────┘ └─────┘ └──┘
txt ─┘
par ─┘
pid ─┘
st ─┘
185 let t := pell_zd_add n (m - n) in
id ┴ └─────────┘ ┴ ┴ ┴ ┴
src └─────────┘ ┴
typ ┴ └─────────┘ ┴ ┴ ┴ ┴
186 by rw [nat.add_sub_of_le h] at t;
id └───────────────┘ ┴
src └──┘└───────────────┘┴ └────┘
typ └──┘└───────────────┘┴┴└────┘
doc └──┘ ┴ └────┘
txt └──┘ ┴ └────┘
par └──┘ ┴ └────┘
pid └┘ ┴ ┴└───┘
st └──────────────────────┘┴└──────
187 rw [t, mul_comm (pell_zd _ n) _, mul_assoc, (is_pell_norm _).1 (is_pell_pell_zd _ _), mul_one]
id ┴ └──────┘ └─────┘ ┴ └───────┘ └──────────┘ └─────────────┘ └─────┘
src └──┘ └┘└──────┘┴ └─────┘└─┘ └───┘└───────┘└┘ └──────────┘└────┘ └─────────────┘└─────┘└─────┘└─
typ └──┘┴└┘└──────┘┴ └─────┘└─┘┴└───┘└───────┘└┘ └──────────┘└────┘ └─────────────┘└─────┘└─────┘└─
doc └──┘ └┘ ┴ └─────┘└─┘ └───┘ └┘ └────┘ └─────┘ └─
txt └──┘ └┘ ┴ └─┘ └───┘ └┘ └────┘ └─────┘ └─
par └──┘ └┘ ┴ └─┘ └───┘ └┘ └────┘ └─────┘ └─
pid └┘ └┘ ┴ └─┘ └───┘ └┘ └────┘ └─────┘ ┴└
st ────────┘┴└────────────────────────┘└─────────┘└────────────────────────────────────────┘└───────┘┴└
188
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
189 theorem xz_sub {m n} (h : n ≤ m) : xz (m - n) = xz m * xz n - d * yz m * yz n :=
id ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └┘
typ ─┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
190 by injection (pell_zd_sub _ h) with h _; repeat {rw ← neg_mul_eq_mul_neg at h}; exact h
id └─────────┘ ┴ └────────────────┘ ┴
src └────────┘ └─────────┘└─┘ └────────┘ └──────┘└───┘└────────────────┘└───┘┴ └────┘ └
typ └────────┘ └─────────┘└─┘┴└────────┘ └──────┘└───┘└────────────────┘└───┘┴ └────┘┴└
doc └────────┘ └─┘ └────────┘ └──────┘└───┘ └───┘┴ └────┘ └
txt └────────┘ └─┘ └────────┘ └──────┘└───┘ └───┘┴ └────┘ └
par └────────┘ └─┘ └────────┘ └──────┘└───┘ └───┘┴ └────┘ └
pid ┴ └─┘ ┴└───────┘ └─────┘ └────┘ ┴ └
st └─────────────────────────────────────────────┘└──────────────────────────┘└┘└────────
191
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
192 theorem yz_sub {m n} (h : n ≤ m) : yz (m - n) = xz n * yz m - xz m * yz n :=
id ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ─┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
193 by injection (pell_zd_sub a1 h) with _ h; repeat {rw ← neg_mul_eq_mul_neg at h}; rw [add_comm, mul_comm] at h; exact h
id └─────────┘ └┘ ┴ └────────────────┘ └──────┘ └──────┘ ┴
src └────────┘ └─────────┘┴ ┴ └────────┘ └──────┘└───┘└────────────────┘└───┘┴ └──┘└──────┘└┘└──────┘└────┘ └────┘ └
typ └────────┘ └─────────┘┴└┘┴┴└────────┘ └──────┘└───┘└────────────────┘└───┘┴ └──┘└──────┘└┘└──────┘└────┘ └────┘┴└
doc └────────┘ ┴ ┴ └────────┘ └──────┘└───┘ └───┘┴ └──┘ └┘ └────┘ └────┘ └
txt └────────┘ ┴ ┴ └────────┘ └──────┘└───┘ └───┘┴ └──┘ └┘ └────┘ └────┘ └
par └────────┘ ┴ ┴ └────────┘ └──────┘└───┘ └───┘┴ └──┘ └┘ └────┘ └────┘ └
pid ┴ ┴ ┴ ┴└───────┘ └─────┘ └────┘ └┘ └┘ ┴└───┘ ┴ └
st └──────────────────────────────────────────────┘└──────────────────────────┘└┘└───┘└──────┘└────────┘┴└──────────────
194
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
195 theorem xy_coprime (n) : (xn n).coprime (yn n) :=
id └┘ ┴ └─────┘ └┘ ┴
src ─┘ └┘ └─────┘ └┘
typ ─┘ └┘ ┴ └─────┘ └┘ ┴
doc ─┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
196 nat.coprime_of_dvd' $ λk kx ky,
id └─────────────────┘ ┴ └┘ └┘
src └─────────────────┘
typ └─────────────────┘ ┴ └┘ └┘
197 let p := pell_eq n in by rw ← p; exact
id ┴ └─────┘ ┴ ┴
src └─────┘ └───┘ └─────
typ ┴ └─────┘ ┴ └───┘┴ └─────
doc └───┘ └─────
txt └───┘ └─────
par └───┘ └─────
pid └─┘ └
st └──────────────
198 nat.dvd_sub (le_of_lt $ nat.lt_of_sub_eq_succ p)
id └─────────┘ └──────┘ └───────────────────┘ ┴
src ─┘└─────────┘┴ └──────┘┴ ┴└───────────────────┘┴ └─
typ ─┘└─────────┘┴ └──────┘┴ ┴└───────────────────┘┴┴└─
doc ─┘ ┴ ┴ ┴ ┴ └─
txt ─┘ ┴ ┴ ┴ ┴ └─
par ─┘ ┴ ┴ ┴ ┴ └─
pid ─┘ ┴ ┴ ┴ ┴ └─
st ───────────────────────────────────────────────────
199 (dvd_mul_of_dvd_right kx _) (dvd_mul_of_dvd_right ky _)
id └┘ └──────────────────┘ └┘
src ───┘ ┴ └──┘ └──────────────────┘┴ └───
typ ───┘ ┴└┘└──┘ └──────────────────┘┴└┘└───
doc ───┘ ┴ └──┘ ┴ └───
txt ───┘ ┴ └──┘ ┴ └───
par ───┘ ┴ └──┘ ┴ └───
pid ───┘ ┴ └──┘ ┴ └─┘└
st ────────────────────────────────────────────────────────────
200
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
201 theorem y_increasing {m} : Π {n}, m < n → yn m < yn n
id ┴┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ ┴ └┘ ┴ └┘
typ ─┘ ┴┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
202 | 0 h := absurd h $ nat.not_lt_zero _
id ┴ └────┘ └─────────────┘
src └────┘ └─────────────┘
typ ┴ └────┘ └─────────────┘
203 | (n+1) h :=
id ┴┴ ┴
src ┴
typ ┴┴ ┴
204 have yn m ≤ yn n, from or.elim (lt_or_eq_of_le $ nat.le_of_succ_le_succ h)
id └┘ ┴ ┴ └┘ └─────┘ └────────────┘ └────────────────────┘
src └┘ ┴ └┘ └─────┘ └────────────┘ └────────────────────┘
typ └┘ ┴ ┴ └┘ └─────┘ └────────────┘ └────────────────────┘
doc └┘ └┘
205 (λhl, le_of_lt $ y_increasing hl) (λe, by rw e),
id └┘ └──────┘ └──────────┘ └┘ ┴ ┴
src └──────┘ └─┘
typ └┘ └──────┘ └──────────┘ └┘ ┴ └─┘┴
doc └─┘
txt └─┘
par └─┘
pid ┴
st └───┘
206 by simp; refine lt_of_le_of_lt _ (nat.lt_add_of_pos_left $ x_pos a1 n);
id └────────────┘ └────────────────────┘ └───┘ └┘ ┴
src └──┘ └─────┘└────────────┘└─┘ └────────────────────┘┴ ┴└───┘┴ ┴ ┴
typ └──┘ └─────┘└────────────┘└─┘ └────────────────────┘┴ ┴└───┘┴└┘┴┴┴
doc └──┘ └─────┘ └─┘ ┴ ┴ ┴ ┴ ┴
txt └──┘ └─────┘ └─┘ ┴ ┴ ┴ ┴ ┴
par └──┘ └─────┘ └─┘ ┴ ┴ ┴ ┴ ┴
pid ┴ └─┘ ┴ ┴ ┴ ┴ ┴
st └─────────────────────────────────────────────────────────────────────
207 rw ← mul_one (yn a1 m);
id └─────┘ └┘ └┘ ┴
src └───┘└─────┘┴ └┘┴ ┴ ┴
typ └───┘└─────┘┴ └┘┴└┘┴┴┴
doc └───┘ ┴ └┘┴ ┴ ┴
txt └───┘ ┴ ┴ ┴ ┴
par └───┘ ┴ ┴ ┴ ┴
pid └─┘ ┴ ┴ ┴ ┴
st ───────────────────────────────
208 exact mul_le_mul this (le_of_lt a1) (nat.zero_le _) (nat.zero_le _)
id └────────┘ └──┘ └──────┘ └┘ └─────────┘
src └────┘└────────┘┴ ┴ └──────┘┴ └┘ └──┘ └─────────┘└───
typ └────┘└────────┘┴└──┘┴ └──────┘┴└┘└┘ └──┘ └─────────┘└───
doc └────┘ ┴ ┴ ┴ └┘ └──┘ └───
txt └────┘ ┴ ┴ ┴ └┘ └──┘ └───
par └────┘ ┴ ┴ ┴ └┘ └──┘ └───
pid ┴ ┴ ┴ ┴ └┘ └──┘ └─┘└
st ───────────────────────────────────────────────────────────────────────────
209
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
210 theorem x_increasing {m} : Π {n}, m < n → xn m < xn n
id ┴┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ ┴ └┘ ┴ └┘
typ ─┘ ┴┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
211 | 0 h := absurd h $ nat.not_lt_zero _
id ┴ └────┘ └─────────────┘
src └────┘ └─────────────┘
typ ┴ └────┘ └─────────────┘
212 | (n+1) h :=
id ┴┴ ┴
src ┴
typ ┴┴ ┴
213 have xn m ≤ xn n, from or.elim (lt_or_eq_of_le $ nat.le_of_succ_le_succ h)
id └┘ ┴ ┴ └┘ └─────┘ └────────────┘ └────────────────────┘
src └┘ ┴ └┘ └─────┘ └────────────┘ └────────────────────┘
typ └┘ ┴ ┴ └┘ └─────┘ └────────────┘ └────────────────────┘
doc └┘ └┘
214 (λhl, le_of_lt $ x_increasing hl) (λe, by rw e),
id └┘ └──────┘ └──────────┘ └┘ ┴ ┴
src └──────┘ └─┘
typ └┘ └──────┘ └──────────┘ └┘ ┴ └─┘┴
doc └─┘
txt └─┘
par └─┘
pid ┴
st └───┘
215 by simp; refine lt_of_lt_of_le (lt_of_le_of_lt this _) (nat.le_add_right _ _);
id └────────────┘ └────────────┘ └──┘ └──────────────┘
src └──┘ └─────┘└────────────┘┴ └────────────┘┴ └──┘ └──────────────┘└───┘
typ └──┘ └─────┘└────────────┘┴ └────────────┘┴└──┘└──┘ └──────────────┘└───┘
doc └──┘ └─────┘ ┴ ┴ └──┘ └───┘
txt └──┘ └─────┘ ┴ ┴ └──┘ └───┘
par └──┘ └─────┘ ┴ ┴ └──┘ └───┘
pid ┴ ┴ ┴ └──┘ └───┘
st └────────────────────────────────────────────────────────────────────────────
216 have t := nat.mul_lt_mul_of_pos_left a1 (x_pos a1 n); rwa mul_one at t
id └────────────────────────┘ └───┘ └┘ ┴ └─────┘
src └────────┘└────────────────────────┘┴ ┴ └───┘┴ ┴ ┴ └──┘└─────┘└─────
typ └────────┘└────────────────────────┘┴ ┴ └───┘┴└┘┴┴┴ └──┘└─────┘└─────
doc └────────┘ ┴ ┴ ┴ ┴ ┴ └──┘ └─────
txt └────────┘ ┴ ┴ ┴ ┴ ┴ └──┘ └─────
par └────────┘ ┴ ┴ ┴ ┴ ┴ └──┘ └─────
pid └────┘┴└─┘ ┴ ┴ ┴ ┴ ┴ ┴ └───┘└
st ────────────────────────────────────────────────────────────────┘└─────┘└─────
217
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
218 theorem yn_ge_n : Π n, n ≤ yn n
id ┴ ┴ ┴ └┘ ┴
src ─┘ ┴ └┘
typ ─┘ ┴ ┴ ┴ └┘ ┴
doc ─┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
219 | 0 := nat.zero_le _
id └─────────┘
src └─────────┘
typ └─────────┘
220 | (n+1) := show n < yn (n+1), from lt_of_le_of_lt (yn_ge_n n) (y_increasing $ nat.lt_succ_self n)
id ┴┴ ┴ └┘ ┴ └────────────┘ └─────┘ └──────────┘ └──────────────┘
src ┴ ┴ └┘ ┴ └────────────┘ └──────────┘ └──────────────┘
typ ┴┴ ┴ └┘ ┴ └────────────┘ └─────┘ └──────────┘ └──────────────┘
doc └┘
221
222 theorem y_mul_dvd (n) : ∀k, yn n ∣ yn (n * k)
id ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴
src └┘ ┴ └┘ ┴
typ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴
doc └┘ └┘
223 | 0 := dvd_zero _
id └──────┘
src └──────┘
typ └──────┘
224 | (k+1) := by rw [nat.mul_succ, yn_add]; exact
id ┴ └──────────┘ └────┘
src ┴ └──┘└──────────┘└┘└────┘┴ └─────
typ ┴ └──┘└──────────┘└┘└────┘┴ └─────
doc └──┘ └┘ ┴ └─────
txt └──┘ └┘ ┴ └─────
par └──┘ └┘ ┴ └─────
pid └┘ └┘ ┴ └
st └───────────────┘└──────┘┴└───────
225 dvd_add (dvd_mul_left _ _) (dvd_mul_of_dvd_left (y_mul_dvd k) _)
id └─────┘ └──────────┘ └─────────────────┘ └───────┘ ┴
src ───┘└─────┘┴ └──────────┘└────┘ └─────────────────┘┴ ┴ └────
typ ───┘└─────┘┴ └──────────┘└────┘ └─────────────────┘┴ └───────┘┴┴└────
doc ───┘ ┴ └────┘ ┴ ┴ └────
txt ───┘ ┴ └────┘ ┴ ┴ └────
par ───┘ ┴ └────┘ ┴ ┴ └────
pid ───┘ ┴ └────┘ ┴ ┴ └──┘└
st ─────────────────────────────────────────────────────────────────────
226
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
227 theorem y_dvd_iff (m n) : yn m ∣ yn n ↔ m ∣ n :=
id └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴
src ─┘ └┘ ┴ └┘ ┴ ┴
typ ─┘ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴
doc ─┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
228 ⟨λh, nat.dvd_of_mod_eq_zero $ (nat.eq_zero_or_pos _).resolve_right $ λhp,
id ┴ └────────────────────┘ └────────────────┘ └───────────┘ └┘
src └────────────────────┘ └────────────────┘ └───────────┘
typ ┴ └────────────────────┘ └────────────────┘ └───────────┘ └┘
229 have co : nat.coprime (yn m) (xn (m * (n / m))), from nat.coprime.symm $
id └─────────┘ └┘ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └──────────────┘
src └─────────┘ └┘ └┘ ┴ ┴ └──────────────┘
typ └─────────┘ └┘ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └──────────────┘
doc └┘ └┘
230 (xy_coprime _).coprime_dvd_right (y_mul_dvd m (n / m)),
id └────────┘ └───────────────┘ └───────┘ ┴ ┴ ┴ ┴
src └────────┘ └───────────────┘ └───────┘ ┴
typ └────────┘ └───────────────┘ └───────┘ ┴ ┴ ┴ ┴
231 have m0 : m > 0, from m.eq_zero_or_pos.resolve_left $
id ┴ ┴ ┴└─────────────┘└───────────┘
src ┴ └─────────────┘└───────────┘
typ ┴ ┴ ┴└─────────────┘└───────────┘
232 λe, by rw [e, nat.mod_zero] at hp; rw [e] at h; exact
id ┴ ┴ └──────────┘ ┴
src └──┘ └┘└──────────┘└─────┘ └──┘ └────┘ └─────
typ ┴ └──┘┴└┘└──────────┘└─────┘ └──┘┴└────┘ └─────
doc └──┘ └┘ └─────┘ └──┘ └────┘ └─────
txt └──┘ └┘ └─────┘ └──┘ └────┘ └─────
par └──┘ └┘ └─────┘ └──┘ └────┘ └─────
pid └┘ └┘ ┴└────┘ └┘ ┴└───┘ └
st └────┘└────────────┘┴└──────────┘┴┴└────────────
233 have 0 < yn a1 n, from y_increasing _ hp,
id ┴ └┘ ┴ └──────────┘ └┘
src ─────┘ └─┘┴┴└┘┴ ┴ └─────┘└──────────┘└─┘ └─
typ ─────┘ └─┘┴┴└┘┴ ┴┴└─────┘└──────────┘└─┘└┘└─
doc ─────┘ └─┘ ┴└┘┴ ┴ └─────┘ └─┘ └─
txt ─────┘ └─┘ ┴ ┴ ┴ └─────┘ └─┘ └─
par ─────┘ └─┘ ┴ ┴ ┴ └─────┘ └─┘ └─
pid ─────┘ └─┘ ┴ ┴ ┴ └─────┘ └─┘ └─
st ────────────────────────────────────────────────
234 ne_of_lt (y_increasing a1 hp) (eq_zero_of_zero_dvd h).symm,
id └──────┘ └┘ └─────────────────┘ ┴
src ─────┘└──────┘┴ ┴ ┴ └┘ └─────────────────┘┴ └────┘
typ ─────┘└──────┘┴ ┴└┘┴ └┘ └─────────────────┘┴┴└────┘
doc ─────┘ ┴ ┴ ┴ └┘ ┴ └────┘
txt ─────┘ ┴ ┴ ┴ └┘ ┴ └────┘
par ─────┘ ┴ ┴ ┴ └┘ ┴ └────┘
pid ─────┘ ┴ ┴ ┴ └┘ ┴ └───┘┴
st ───────────────────────────────────────────────────────────────┘
235 by rw [← nat.mod_add_div n m, yn_add] at h; exact
id └─────────────┘ ┴ ┴ └────┘
src └────┘└─────────────┘┴ ┴ └┘└────┘└────┘ └─────
typ └────┘└─────────────┘┴┴┴┴└┘└────┘└────┘ └─────
doc └────┘ ┴ ┴ └┘ └────┘ └─────
txt └────┘ ┴ ┴ └┘ └────┘ └─────
par └────┘ ┴ ┴ └┘ └────┘ └─────
pid └──┘ ┴ ┴ └┘ ┴└───┘ └
st └────────────────────────┘└──────┘┴└────────────
236 not_le_of_gt (y_increasing _ $ nat.mod_lt n m0)
id └──────────┘ └────────┘ ┴ └┘
src ───┘└──────────┘┴ └─┘ ┴└────────┘┴ ┴ └─
typ ───┘└──────────┘┴ └─┘ ┴└────────┘┴┴┴└┘└─
doc ───┘ ┴ └─┘ ┴ ┴ ┴ └─
txt ───┘ ┴ └─┘ ┴ ┴ ┴ └─
par ───┘ ┴ └─┘ ┴ ┴ ┴ └─
pid ───┘ ┴ └─┘ ┴ ┴ ┴ └─
st ────────────────────────────────────────────────────
237 (nat.le_of_dvd (y_increasing _ hp) $ co.dvd_of_dvd_mul_right $
id └───────────┘ └──────────┘ └┘ └─────────────────────┘
src ────┘ └───────────┘┴ └──────────┘└─┘ └┘ ┴└─────────────────────┘┴ └
typ ────┘ └───────────┘┴ └──────────┘└─┘└┘└┘ ┴└─────────────────────┘┴ └
doc ────┘ ┴ └─┘ └┘ ┴ ┴ └
txt ────┘ ┴ └─┘ └┘ ┴ ┴ └
par ────┘ ┴ └─┘ └┘ ┴ ┴ └
pid ────┘ ┴ └─┘ └┘ ┴ ┴ └
st ────────────────────────────────────────────────────────────────────
238 (nat.dvd_add_iff_right $ dvd_mul_of_dvd_right (y_mul_dvd _ _ _) _).2 h),
id └───────────────────┘ └──────────────────┘ └───────┘ ┴
src ─────┘ └───────────────────┘┴ ┴└──────────────────┘┴ └───────┘└───────────┘ ┴
typ ─────┘ └───────────────────┘┴ ┴└──────────────────┘┴ └───────┘└───────────┘┴┴
doc ─────┘ ┴ ┴ ┴ └───────────┘ ┴
txt ─────┘ ┴ ┴ ┴ └───────────┘ ┴
par ─────┘ ┴ ┴ ┴ └───────────┘ ┴
pid ─────┘ ┴ ┴ ┴ └───────────┘ ┴
st ────────────────────────────────────────────────────────────────────────────┘
239 λ⟨k, e⟩, by rw e; apply y_mul_dvd⟩
id ┴ ┴ └───────┘
src └─┘ └────┘└───────┘
typ ┴ └─┘┴ └────┘└───────┘
doc └─┘ └────┘
txt └─┘ └────┘
par └─┘ └────┘
pid ┴ ┴
st └────────────────────┘
240
241 theorem xy_modeq_yn (n) :
242 ∀k, xn (n * k) ≡ (xn n)^k [MOD (yn n)^2]
id ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴┴ └──┘ └┘ ┴ ┴ ┴
src └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴ ┴
typ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴┴ └──┘ └┘ ┴ ┴ ┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
243 ∧ yn (n * k) ≡ k * (xn n)^(k-1) * yn n [MOD (yn n)^3]
id ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴┴ ┴ └┘ ┴ └──┘ └┘ ┴ ┴ ┴
src ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └──┘ └┘ ┴ ┴
typ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴┴ ┴ └┘ ┴ └──┘ └┘ ┴ ┴ ┴
doc └┘ ┴ └┘ └┘ └──┘ └┘ ┴
244 | 0 := by constructor; simp
src └─────────┘ └────
typ └─────────┘ └────
doc └─────────┘ └────
txt └─────────┘ └────
par └─────────┘ └────
pid └
st └──────────────────
245 | (k+1) :=
id ┴┴
src ─┘ ┴
typ ─┘ ┴┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
246 let ⟨hx, hy⟩ := xy_modeq_yn k in
id └─┘ └┘ └─────────┘
typ └─┘ └┘ └─────────┘
247 have L : xn (n * k) * xn n + d * yn (n * k) * yn n ≡ xn n^k * xn n + 0 [MOD yn n^2], from
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴ ┴
src └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴ ┴
typ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴ ┴
doc └┘ └┘ └┘ └┘ ┴ └┘ └┘ └──┘ └┘ ┴
248 modeq.modeq_add (modeq.modeq_mul_right _ hx) $ modeq.modeq_zero_iff.2 $
id └─────────────┘ └───────────────────┘ └──────────────────┘┴
src └─────────────┘ └───────────────────┘ └──────────────────┘┴
typ └─────────────┘ └───────────────────┘ └──────────────────┘┴
249 by rw nat.pow_succ; exact
id └──────────┘
src └─┘└──────────┘ └─────
typ └─┘└──────────┘ └─────
doc └─┘ └─────
txt └─┘ └─────
par └─┘ └─────
pid ┴ └
st └───────────────────────
250 mul_dvd_mul_right (dvd_mul_of_dvd_right (modeq.modeq_zero_iff.1 $
id └───────────────┘ └──────────────────┘
src ─────┘└───────────────┘┴ └──────────────────┘┴ └─┘ └
typ ─────┘└───────────────┘┴ └──────────────────┘┴ └─┘ └
doc ─────┘ ┴ ┴ └─┘ └
txt ─────┘ ┴ ┴ └─┘ └
par ─────┘ ┴ ┴ └─┘ └
pid ─────┘ ┴ ┴ └─┘ └
st ────────────────────────────────────────────────────────────────────────
251 (hy.modeq_of_dvd_of_modeq $ by simp [nat.pow_succ]).trans $ modeq.modeq_zero_iff.2 $
id └──────────────────────┘ └──────────┘ └──────────────────┘
src ───────┘ └──────────────────────┘┴ ┴ ┴└────┘└──────────┘┴└──────┘ ┴└──────────────────┘└─┘ └
typ ───────┘ └──────────────────────┘┴ ┴ ┴└────┘└──────────┘┴└──────┘ ┴└──────────────────┘└─┘ └
doc ───────┘ ┴ ┴ ┴└────┘ ┴└──────┘ ┴ └─┘ └
txt ───────┘ ┴ ┴ ┴└────┘ ┴└──────┘ ┴ └─┘ └
par ───────┘ ┴ ┴ ┴└────┘ ┴└──────┘ ┴ └─┘ └
pid ───────┘ ┴ ┴ └─────┘ └───────┘ ┴ └─┘ └
st ─────────────────────────────────────┘└──────────────────┘└──────────────────────────────────
252 by simp [-mul_comm, -mul_assoc]) _) _,
src ───────┘ ┴└──────────────────────────┘└────┘
typ ───────┘ ┴└──────────────────────────┘└────┘
doc ───────┘ ┴└──────────────────────────┘└────┘
txt ───────┘ ┴└──────────────────────────┘└────┘
par ───────┘ ┴└──────────────────────────┘└────┘
pid ───────┘ └─────────────────────────────────┘
st ─────────┘└───────────────────────────┘└────┘
253 have R : xn (n * k) * yn n + yn (n * k) * xn n ≡
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴
src └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴
typ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴
doc └┘ └┘ └┘ └┘ ┴
254 xn n^k * yn n + k * xn n^k * yn n [MOD yn n^3], from
id └┘ ┴┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴┴ ┴ └┘ ┴ └──┘ └┘ ┴┴ ┴
src └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ └──┘ └┘ ┴ ┴
typ └┘ ┴┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴┴ ┴ └┘ ┴ └──┘ └┘ ┴┴ ┴
doc └┘ └┘ └┘ └┘ └──┘ └┘ ┴
255 modeq.modeq_add (by rw nat.pow_succ; exact modeq.modeq_mul_right' _ hx) $
id └─────────────┘ └──────────┘ └────────────────────┘ └┘
src └─────────────┘ └─┘└──────────┘ └────┘└────────────────────┘└─┘
typ └─────────────┘ └─┘└──────────┘ └────┘└────────────────────┘└─┘└┘
doc └─┘ └────┘ └─┘
txt └─┘ └────┘ └─┘
par └─┘ └────┘ └─┘
pid ┴ ┴ └─┘
st └─────────────────────────────────────────────────┘
256 have k * xn n^(k - 1) * yn n * xn n = k * xn n^k * yn n,
id ┴ └┘ ┴┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴┴ ┴ └┘ ┴
src ┴ └┘ ┴ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘
typ ┴ └┘ ┴┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴┴ ┴ └┘ ┴
doc └┘ └┘ └┘ └┘ └┘
257 by clear _let_match; cases k with k; simp [nat.pow_succ, mul_comm, mul_left_comm],
id ┴ └──────────┘ └──────┘ └───────────┘
src └──────────────┘ └────┘ └─────┘ └────┘└──────────┘└┘└──────┘└┘└───────────┘┴
typ └──────────────┘ └────┘┴└─────┘ └────┘└──────────┘└┘└──────┘└┘└───────────┘┴
doc └──────────────┘ └────┘ └─────┘ └────┘ └┘ └┘ ┴
txt └──────────────┘ └────┘ └─────┘ └────┘ └┘ └┘ ┴
par └──────────────┘ └────┘ └─────┘ └────┘ └┘ └┘ ┴
pid └─────────┘ ┴ └─────┘ ┴┴ └┘ └┘ ┴
st └─────────────────────────────────────────────────────────────────────────────┘
258 by rw ← this; exact modeq.modeq_mul_right _ hy,
id └──┘ └───────────────────┘ └┘
src └───┘ └────┘└───────────────────┘└─┘
typ └───┘└──┘ └────┘└───────────────────┘└─┘└┘
doc └───┘ └────┘ └─┘
txt └───┘ └────┘ └─┘
par └───┘ └────┘ └─┘
pid └─┘ ┴ └─┘
st └──────────────────────────────────────────┘
259 by rw [nat.add_sub_cancel, nat.mul_succ, xn_add, yn_add, nat.pow_succ (xn _ n),
id └────────────────┘ └──────────┘ └────┘ └────┘ └──────────┘ └┘ ┴
src └──┘└────────────────┘└┘└──────────┘└┘└────┘└┘└────┘└┘└──────────┘┴ └┘└─┘ └──
typ └──┘└────────────────┘└┘└──────────┘└┘└────┘└┘└────┘└┘└──────────┘┴ └┘└─┘┴└──
doc └──┘ └┘ └┘ └┘ └┘ ┴ └┘└─┘ └──
txt └──┘ └┘ └┘ └┘ └┘ ┴ └─┘ └──
par └──┘ └┘ └┘ └┘ └┘ ┴ └─┘ └──
pid └┘ └┘ └┘ └┘ └┘ ┴ └─┘ └──
st └─────────────────────┘└────────────┘└──────┘└──────┘└─────────────────────┘└─
260 nat.succ_mul, add_comm (k * xn _ n^k) (xn _ n^k), right_distrib];
id └──────────┘ └──────┘ ┴ ┴ └┘ ┴ ┴ └───────────┘
src ──────────┘└──────────┘└┘└──────┘┴ ┴┴┴ └─┘ ┴ └┘ └┘└─┘ └─┘└───────────┘┴
typ ──────────┘└──────────┘└┘└──────┘┴ ┴┴┴ └─┘ ┴ └┘ └┘└─┘┴ ┴└─┘└───────────┘┴
doc ──────────┘ └┘ ┴ ┴ ┴ └─┘ └┘ └┘└─┘ └─┘ ┴
txt ──────────┘ └┘ ┴ ┴ ┴ └─┘ └┘ └─┘ └─┘ ┴
par ──────────┘ └┘ ┴ ┴ ┴ └─┘ └┘ └─┘ └─┘ ┴
pid ──────────┘ └┘ ┴ ┴ ┴ └─┘ └┘ └─┘ └─┘ ┴
st ──────────────────────┘└──────────────────────────────────┘└─────────────┘┴└─
261 exact ⟨L, R⟩
id ┴ ┴
src └────┘ └┘ └─
typ └────┘ ┴└┘┴└─
doc └────┘ └┘ └─
txt └────┘ └┘ └─
par └────┘ └┘ └─
pid ┴ └┘ ┴└
st ────────────────────
262
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
263 theorem ysq_dvd_yy (n) : yn n * yn n ∣ yn (n * yn n) :=
id └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ─┘ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
264 modeq.modeq_zero_iff.1 $
id └──────────────────┘┴
src └──────────────────┘┴
typ └──────────────────┘┴
265 ((xy_modeq_yn n (yn n)).right.modeq_of_dvd_of_modeq $ by simp [nat.pow_succ]).trans
id └─────────┘ ┴ └┘ ┴ └───┘ └───────────────────┘ └──────────┘ └───┘
src └─────────┘ └┘ └───┘ └───────────────────┘ └────┘└──────────┘┴ └───┘
typ └─────────┘ ┴ └┘ ┴ └───┘ └───────────────────┘ └────┘└──────────┘┴ └───┘
doc └┘ └────┘ ┴
txt └────┘ ┴
par └────┘ ┴
pid ┴┴ ┴
st └──────────────────┘
266 (modeq.modeq_zero_iff.2 $ by simp [mul_dvd_mul_left, mul_assoc])
id └──────────────────┘┴ └──────────────┘ └───────┘
src └──────────────────┘┴ └────┘└──────────────┘└┘└───────┘┴
typ └──────────────────┘┴ └────┘└──────────────┘└┘└───────┘┴
doc └────┘ └┘ ┴
txt └────┘ └┘ ┴
par └────┘ └┘ ┴
pid ┴┴ └┘ ┴
st └─────────────────────────────────┘
267
268 theorem dvd_of_ysq_dvd {n t} (h : yn n * yn n ∣ yn t) : yn n ∣ t :=
id └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ ┴
src └┘ ┴ └┘ ┴ └┘ └┘ ┴
typ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ ┴
doc └┘ └┘ └┘ └┘
269 have nt : n ∣ t, from (y_dvd_iff n t).1 $ dvd_of_mul_left_dvd h,
id ┴ ┴ ┴ └───────┘ ┴ ┴ ┴ └─────────────────┘ ┴
src ┴ └───────┘ ┴ └─────────────────┘
typ ┴ ┴ ┴ └───────┘ ┴ ┴ ┴ └─────────────────┘ ┴
270 n.eq_zero_or_pos.elim (λn0, by rw n0; rw n0 at nt; exact nt) $ λ(n0l : n > 0),
id ┴└─────────────┘└───┘ └┘ └┘ └┘ └┘ ┴ ┴
src └─────────────┘└───┘ └─┘ └─┘ └────┘ └────┘ ┴
typ ┴└─────────────┘└───┘ └┘ └─┘└┘ └─┘└┘└────┘ └────┘└┘ ┴ ┴
doc └─┘ └─┘ └────┘ └────┘
txt └─┘ └─┘ └────┘ └────┘
par └─┘ └─┘ └────┘ └────┘
pid ┴ ┴ └────┘ ┴
st └─────────┘└┘└──────────────┘
271 let ⟨k, ke⟩ := nt in
id └─┘ ┴ └┘
typ └─┘ ┴ └┘
272 have yn n ∣ k * (xn n)^(k-1), from
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴
src └┘ ┴ ┴ └┘ ┴ ┴
typ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴
doc └┘ └┘
273 nat.dvd_of_mul_dvd_mul_right (y_increasing n0l) $ modeq.modeq_zero_iff.1 $
id └──────────────────────────┘ └──────────┘ └─┘ └──────────────────┘┴
src └──────────────────────────┘ └──────────┘ └──────────────────┘┴
typ └──────────────────────────┘ └──────────┘ └─┘ └──────────────────┘┴
274 by have xm := (xy_modeq_yn a1 n k).right; rw ← ke at xm; exact
id └─────────┘ └┘ ┴ ┴ └┘
src └─────────┘ └─────────┘┴ ┴ ┴ └─────┘ └───┘ └────┘ └─────
typ └─────────┘ └─────────┘┴└┘┴┴┴┴└─────┘ └───┘└┘└────┘ └─────
doc └─────────┘ ┴ ┴ ┴ └─────┘ └───┘ └────┘ └─────
txt └─────────┘ ┴ ┴ ┴ └─────┘ └───┘ └────┘ └─────
par └─────────┘ ┴ ┴ ┴ └─────┘ └───┘ └────┘ └─────
pid └─────┘┴└─┘ ┴ ┴ ┴ └────┘┴ └─┘ └────┘ └
st └────────────────────────────────────────────────────────────
275 (xm.modeq_of_dvd_of_modeq $ by simp [nat.pow_succ]).symm.trans
id └──────────────────────┘ └──────────┘
src ───┘ └──────────────────────┘┴ ┴ ┴└────┘└──────────┘┴└────────────
typ ───┘ └──────────────────────┘┴ ┴ ┴└────┘└──────────┘┴└────────────
doc ───┘ ┴ ┴ ┴└────┘ ┴└────────────
txt ───┘ ┴ ┴ ┴└────┘ ┴└────────────
par ───┘ ┴ ┴ ┴└────┘ ┴└────────────
pid ───┘ ┴ ┴ └─────┘ └─────────────
st ─────────────────────────────────┘└──────────────────┘└────────────
276 (modeq.modeq_zero_iff.2 h),
id └──────────────────┘ ┴
src ─────┘ └──────────────────┘└─┘ ┴
typ ─────┘ └──────────────────┘└─┘┴┴
doc ─────┘ └─┘ ┴
txt ─────┘ └─┘ ┴
par ─────┘ └─┘ ┴
pid ─────┘ └─┘ ┴
st ───────────────────────────────┘
277 by rw ke; exact dvd_mul_of_dvd_right
id └┘ └──────────────────┘
src └─┘ └────┘└──────────────────┘└
typ └─┘└┘ └────┘└──────────────────┘└
doc └─┘ └────┘ └
txt └─┘ └────┘ └
par └─┘ └────┘ └
pid ┴ ┴ └
st └──────────────────────────────────
278 (((xy_coprime _ _).pow_left _).symm.dvd_of_dvd_mul_right this) _
id └────────┘ └──┘
src ───┘ └────────┘└──────────────────────────────────────────┘ └───
typ ───┘ └────────┘└──────────────────────────────────────────┘└──┘└───
doc ───┘ └──────────────────────────────────────────┘ └───
txt ───┘ └──────────────────────────────────────────┘ └───
par ───┘ └──────────────────────────────────────────┘ └───
pid ───┘ └──────────────────────────────────────────┘ └─┘└
st ─────────────────────────────────────────────────────────────────────
279
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
280 theorem pell_zd_succ_succ (n) : pell_zd (n + 2) + pell_zd n = (2 * a : ℕ) * pell_zd (n + 1) :=
id └─────┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴
src ─┘ └─────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └─────┘ ┴
typ ─┘ └─────┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴
doc ─┘ └─────┘ └─────┘ └─────┘
txt ─┘
par ─┘
pid ─┘
st ─┘
281 have (1:ℤ√d) + ⟨a, 1⟩ * ⟨a, 1⟩ = ⟨a, 1⟩ * (2 * a),
id └┘┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src └┘┴ ┴ ┴ ┴ ┴ ┴
typ └┘┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
doc └┘
282 by rw zsqrtd.coe_nat_val; change (⟨_,_⟩:ℤ√(d a1))=⟨_,_⟩;
id └────────────────┘ ┴ └┘ ┴
src └─┘└────────────────┘ └─────┘ └───┘ ┴┴ └┘┴ └──┘
typ └─┘└────────────────┘ └─────┘ └───┘ ┴┴└┘└┘┴ └──┘
doc └─┘ └─────┘ └───┘ ┴ └┘ └──┘
txt └─┘ └─────┘ └───┘ ┴ └┘ └──┘
par └─┘ └─────┘ └───┘ ┴ └┘ └──┘
pid ┴ ┴ └───┘ ┴ └┘ └──┘
st └──────────────────────────────────────────────────────
283 rw dz_val; change az a1 with a; simp [mul_add, add_mul],
id └────┘ └┘ └┘ ┴ └─────┘ └─────┘
src └─┘└────┘ └─────┘└┘┴ └────┘ └────┘└─────┘└┘└─────┘┴
typ └─┘└────┘ └─────┘└┘┴└┘└────┘┴ └────┘└─────┘└┘└─────┘┴
doc └─┘ └─────┘ ┴ └────┘ └────┘ └┘ ┴
txt └─┘ └─────┘ ┴ └────┘ └────┘ └┘ ┴
par └─┘ └─────┘ ┴ └────┘ └────┘ └┘ ┴
pid ┴ ┴ ┴ └────┘ ┴┴ └┘ ┴
st ───────┘└────┘└────────────────────────────────────────────┘
284 by simpa [mul_add, mul_comm, mul_left_comm] using congr_arg (* pell_zd a1 n) this
id └─────┘ └──────┘ └───────────┘ └───────┘ ┴ └─────┘ └┘ ┴ └──┘
src └─────┘└─────┘└┘└──────┘└┘└───────────┘└──────┘└───────┘┴┴└┘└─────┘┴ ┴ └┘ └
typ └─────┘└─────┘└┘└──────┘└┘└───────────┘└──────┘└───────┘┴┴└┘└─────┘┴└┘┴┴└┘└──┘└
doc └─────┘ └┘ └┘ └──────┘ ┴ └┘└─────┘┴ ┴ └┘ └
txt └─────┘ └┘ └┘ └──────┘ ┴ └┘ ┴ ┴ └┘ └
par └─────┘ └┘ └┘ └──────┘ ┴ └┘ ┴ ┴ └┘ └
pid ┴┴ └┘ └┘ ┴┴└────┘ ┴ └┘ ┴ ┴ └┘ └
st └───────────────────────────────────────────────────────────────────────────────
285
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
286 theorem xy_succ_succ (n) : xn (n + 2) + xn n = (2 * a) * xn (n + 1) ∧
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴
src ─┘ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴
typ ─┘ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴
doc ─┘ └┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
287 yn (n + 2) + yn n = (2 * a) * yn (n + 1) := begin
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴
src └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
typ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴
doc └┘ └┘ └┘
st └─────
288 have := pell_zd_succ_succ a1 n, unfold pell_zd at this,
id └───────────────┘ └┘ ┴
src └──────┘└───────────────┘┴ ┴ └────────────────────┘
typ └──────┘└───────────────┘┴└┘┴┴ └────────────────────┘
doc └──────┘ ┴ ┴ └────────────────────┘
txt └──────┘ ┴ ┴ └────────────────────┘
par └──────┘ ┴ ┴ └────────────────────┘
pid └───┘└─┘ ┴ ┴ └──────┘└──────┘
st ─────────────────────────────────┘└──────────────────────┘└─
289 rw [← int.cast_coe_nat, zsqrtd.smul_val] at this,
id └──────────────┘ └─────────────┘
src └────┘└──────────────┘└┘└─────────────┘└───────┘
typ └────┘└──────────────┘└┘└─────────────┘└───────┘
doc └────┘ └┘ └───────┘
txt └────┘ └┘ └───────┘
par └────┘ └┘ └───────┘
pid └──┘ └┘ ┴└──────┘
st ─────────────────────────┘└───────────────┘┴└──────┘└─
290 injection this with h₁ h₂,
id └──┘
src └────────┘ └─────────┘
typ └────────┘└──┘└─────────┘
doc └────────┘ └─────────┘
txt └────────┘ └─────────┘
par └────────┘ └─────────┘
pid ┴ └─────────┘
st ────────────────────────────┘└─
291 split; apply int.coe_nat_inj; [simpa using h₁, simpa using h₂]
id └─────────────┘ ┴ └┘ └┘
src └───┘ └────┘└─────────────┘ ┴└──────────┘ └──────────┘
typ └───┘ └────┘└─────────────┘ ┴└──────────┘└┘ └──────────┘└┘
doc └───┘ └────┘ └──────────┘ └──────────┘
txt └───┘ └────┘ └──────────┘ └──────────┘
par └───┘ └────┘ └──────────┘ └──────────┘
pid ┴ ┴└────┘ ┴└────┘
st ─────────────────────────────────────────────────────────────────┘└
292 end
st ────┘
293
294 theorem xn_succ_succ (n) : xn (n + 2) + xn n = (2 * a) * xn (n + 1) := (xy_succ_succ n).1
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──────────┘ ┴ ┴
src └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └──────────┘ ┴
typ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──────────┘ ┴ ┴
doc └┘ └┘ └┘
295 theorem yn_succ_succ (n) : yn (n + 2) + yn n = (2 * a) * yn (n + 1) := (xy_succ_succ n).2
id └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──────────┘ ┴ ┴
src └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └──────────┘ ┴
typ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──────────┘ ┴ ┴
doc └┘ └┘ └┘
296
297 theorem xz_succ_succ (n) : xz (n + 2) = (2 * a : ℕ) * xz (n + 1) - xz n :=
id └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
src └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘
typ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
298 eq_sub_of_add_eq $ by delta xz; rw [← int.coe_nat_add, ← int.coe_nat_mul, xn_succ_succ]
id └──────────────┘ └─────────────┘ └─────────────┘ └──────────┘
src └──────────────┘ └──────┘ └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
typ └──────────────┘ └──────┘ └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
doc └──────┘ └────┘ └──┘ └┘ └─
txt └──────┘ └────┘ └──┘ └┘ └─
par └──────┘ └────┘ └──┘ └┘ └─
pid └─┘ └──┘ └──┘ └┘ ┴└
st └─────────────┘└───────────────┘└─────────────────┘└────────────┘┴└
299
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
300 theorem yz_succ_succ (n) : yz (n + 2) = (2 * a : ℕ) * yz (n + 1) - yz n :=
id └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
src ─┘ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘
typ ─┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
301 eq_sub_of_add_eq $ by delta yz; rw [← int.coe_nat_add, ← int.coe_nat_mul, yn_succ_succ]
id └──────────────┘ └─────────────┘ └─────────────┘ └──────────┘
src └──────────────┘ └──────┘ └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
typ └──────────────┘ └──────┘ └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
doc └──────┘ └────┘ └──┘ └┘ └─
txt └──────┘ └────┘ └──┘ └┘ └─
par └──────┘ └────┘ └──┘ └┘ └─
pid └─┘ └──┘ └──┘ └┘ ┴└
st └─────────────┘└───────────────┘└─────────────────┘└────────────┘┴└
302
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
303 theorem yn_modeq_a_sub_one : ∀ n, yn n ≡ n [MOD a-1]
id ┴ └┘ ┴ ┴ ┴ └──┘ ┴┴ ┴
src ─┘ └┘ ┴ └──┘ ┴ ┴
typ ─┘ ┴ └┘ ┴ ┴ ┴ └──┘ ┴┴ ┴
doc ─┘ └┘ ┴ └──┘ ┴
txt ─┘
par ─┘
pid ─┘
st ─┘
304 | 0 := by simp
src └────
typ └────
doc └────
txt └────
par └────
pid └
st └─────
305 | 1 := by simp
src ─┘ └────
typ ─┘ └────
doc ─┘ └────
txt ─┘ └────
par ─┘ └────
pid ─┘ └
st ─┘ └─────
306 | (n+2) := modeq.modeq_add_cancel_right (yn_modeq_a_sub_one n) $
id ┴┴ └──────────────────────────┘ └────────────────┘
src ─┘ ┴ └──────────────────────────┘
typ ─┘ ┴┴ └──────────────────────────┘ └────────────────┘
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
307 have 2*(n+1) = n+2+n, by simp [two_mul],
id ┴ ┴ ┴ ┴ ┴ └─────┘
src ┴ ┴ ┴ ┴ ┴ └────┘└─────┘┴
typ ┴ ┴ ┴ ┴ ┴ └────┘└─────┘┴
doc └────┘ ┴
txt └────┘ ┴
par └────┘ ┴
pid ┴┴ ┴
st └─────────────┘
308 by rw [yn_succ_succ, ← this];
id └──────────┘ └──┘
src └──┘└──────────┘└──┘ ┴
typ └──┘└──────────┘└──┘└──┘┴
doc └──┘ └──┘ ┴
txt └──┘ └──┘ ┴
par └──┘ └──┘ ┴
pid └┘ └──┘ ┴
st └───────────────┘└──────┘┴└─
309 refine modeq.modeq_mul (modeq.modeq_mul_left 2 (_ : a ≡ 1 [MOD a-1])) (yn_modeq_a_sub_one (n+1));
id └─────────────┘ └──────────────────┘ ┴ ┴ └────────────────┘ ┴┴
src └─────┘└─────────────┘┴ └──────────────────┘└─┘ └──┘ ┴ └─┘ ┴ ┴┴ └─┘ ┴ ┴└─┘
typ └─────┘└─────────────┘┴ └──────────────────┘└─┘ └──┘┴┴ └─┘ ┴ ┴┴ └─┘ └────────────────┘┴ ┴┴└─┘
doc └─────┘ ┴ └─┘ └──┘ ┴ └─┘ ┴ ┴ └─┘ ┴ └─┘
txt └─────┘ ┴ └─┘ └──┘ ┴ └─┘ ┴ ┴ └─┘ ┴ └─┘
par └─────┘ ┴ └─┘ └──┘ ┴ └─┘ ┴ ┴ └─┘ ┴ └─┘
pid ┴ ┴ └─┘ └──┘ ┴ └─┘ ┴ ┴ └─┘ ┴ └─┘
st ──────────────────────────────────────────────────────────────────────────────────────────────────────
310 exact (modeq.modeq_of_dvd $ by rw [int.coe_nat_sub $ le_of_lt a1]; apply dvd_refl).symm
id └────────────────┘ └─────────────┘ └──────┘ └┘
src └────┘ └────────────────┘┴ ┴ ┴└──┘└─────────────┘┴ ┴└──────┘┴ ┴└┘└────┘ └──────
typ └────┘ └────────────────┘┴ ┴ ┴└──┘└─────────────┘┴ ┴└──────┘┴└┘┴└──────┘ └──────
doc └────┘ ┴ ┴ ┴└──┘ ┴ ┴ ┴ ┴└┘└────┘ └──────
txt └────┘ ┴ ┴ ┴└──┘ ┴ ┴ ┴ ┴└┘└────┘ └──────
par └────┘ ┴ ┴ ┴└──┘ ┴ ┴ ┴ ┴└──────┘ └──────
pid ┴ ┴ ┴ └───┘ ┴ ┴ ┴ └───────┘ └───┘└─
st ─────────────────────────────────┘└────────────────────────────────┘┴└──────────────┘└──────
311
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
312 theorem yn_modeq_two : ∀ n, yn n ≡ n [MOD 2]
id ┴ └┘ ┴ ┴ ┴ └──┘ ┴
src ─┘ └┘ ┴ └──┘ ┴
typ ─┘ ┴ └┘ ┴ ┴ ┴ └──┘ ┴
doc ─┘ └┘ ┴ └──┘ ┴
txt ─┘
par ─┘
pid ─┘
st ─┘
313 | 0 := by simp
src └────
typ └────
doc └────
txt └────
par └────
pid └
st └─────
314 | 1 := by simp
src ─┘ └────
typ ─┘ └────
doc ─┘ └────
txt ─┘ └────
par ─┘ └────
pid ─┘ └
st ─┘ └─────
315 | (n+2) := modeq.modeq_add_cancel_right (yn_modeq_two n) $
id ┴┴ └──────────────────────────┘ └──────────┘
src ─┘ ┴ └──────────────────────────┘
typ ─┘ ┴┴ └──────────────────────────┘ └──────────┘
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
316 have 2*(n+1) = n+2+n, by simp [two_mul],
id ┴ ┴ ┴ ┴ ┴ └─────┘
src ┴ ┴ ┴ ┴ ┴ └────┘└─────┘┴
typ ┴ ┴ ┴ ┴ ┴ └────┘└─────┘┴
doc └────┘ ┴
txt └────┘ ┴
par └────┘ ┴
pid ┴┴ ┴
st └─────────────┘
317 by rw [yn_succ_succ, ← this];
id └──────────┘ └──┘
src └──┘└──────────┘└──┘ ┴
typ └──┘└──────────┘└──┘└──┘┴
doc └──┘ └──┘ ┴
txt └──┘ └──┘ ┴
par └──┘ └──┘ ┴
pid └┘ └──┘ ┴
st └───────────────┘└──────┘┴└─
318 refine modeq.modeq_mul _ (yn_modeq_two (n+1));
id └─────────────┘ └──────────┘ ┴┴
src └─────┘└─────────────┘└─┘ ┴ ┴└─┘
typ └─────┘└─────────────┘└─┘ └──────────┘┴ ┴┴└─┘
doc └─────┘ └─┘ ┴ └─┘
txt └─────┘ └─┘ ┴ └─┘
par └─────┘ └─┘ ┴ └─┘
pid ┴ └─┘ ┴ └─┘
st ───────────────────────────────────────────────────
319 exact modeq.trans
id └─────────┘
src └────┘└─────────┘└
typ └────┘└─────────┘└
doc └────┘ └
txt └────┘ └
par └────┘ └
pid ┴ └
st ──────────────────────
320 (modeq.modeq_zero_iff.2 $ by simp)
src ─────┘ └─┘ ┴ ┴└──┘└─
typ ─────┘ └─┘ ┴ ┴└──┘└─
doc ─────┘ └─┘ ┴ ┴└──┘└─
txt ─────┘ └─┘ ┴ ┴└──┘└─
par ─────┘ └─┘ ┴ ┴└──┘└─
pid ─────┘ └─┘ ┴ └──────
st ─────────────────────────────────┘└───┘└─
321 (modeq.modeq_zero_iff.2 $ by simp).symm
id └──────────────────┘
src ─────┘ └──────────────────┘└─┘ ┴ ┴└──┘└──────
typ ─────┘ └──────────────────┘└─┘ ┴ ┴└──┘└──────
doc ─────┘ └─┘ ┴ ┴└──┘└──────
txt ─────┘ └─┘ ┴ ┴└──┘└──────
par ─────┘ └─┘ ┴ ┴└──┘└──────
pid ─────┘ └─┘ ┴ └────────┘└─
st ─────────────────────────────────┘└───┘└──────
322
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
323 lemma x_sub_y_dvd_pow_lem (y2 y1 y0 yn1 yn0 xn1 xn0 ay a2 : ℤ) :
id ┴
src ─┘ ┴
typ ─┘ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
324 (a2 * yn1 - yn0) * ay + y2 - (a2 * xn1 - xn0) =
id └┘ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └─┘ ┴ └─┘ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ └┘ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └─┘ ┴ └─┘ ┴
325 y2 - a2 * y1 + y0 + a2 * (yn1 * ay + y1 - xn1) - (yn0 * ay + y0 - xn0) := by ring
id └┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └─┘ ┴ └┘ ┴ └┘ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴ └┘ ┴ └─┘
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────
typ └┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └─┘ ┴ └┘ ┴ └┘ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴ └┘ ┴ └─┘ └────
doc └────
txt └────
par └────
pid └
st └─────
326
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
327 theorem x_sub_y_dvd_pow (y : ℕ) :
id ┴
src ─┘ ┴
typ ─┘ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
328 ∀ n, (2*a*y - y*y - 1 : ℤ) ∣ yz n * (a - y) + ↑(y^n) - xz n
id ┴ ┴┴┴┴ ┴ ┴┴┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴┴┴ ┴ └┘ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘
typ ┴ ┴┴┴┴ ┴ ┴┴┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴┴┴ ┴ └┘ ┴
329 | 0 := by simp [xz, yz, int.coe_nat_zero, int.coe_nat_one]
id └┘ └┘ └──────────────┘ └─────────────┘
src └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
typ └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
doc └────┘ └┘ └┘ └┘ └─
txt └────┘ └┘ └┘ └┘ └─
par └────┘ └┘ └┘ └┘ └─
pid ┴┴ └┘ └┘ └┘ ┴└
st └─────────────────────────────────────────────────
330 | 1 := by simp [xz, yz, int.coe_nat_zero, int.coe_nat_one]
id └┘ └┘ └──────────────┘ └─────────────┘
src ─┘ └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
typ ─┘ └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
doc ─┘ └────┘ └┘ └┘ └┘ └─
txt ─┘ └────┘ └┘ └┘ └┘ └─
par ─┘ └────┘ └┘ └┘ └┘ └─
pid ─┘ ┴┴ └┘ └┘ └┘ ┴└
st ─┘ └─────────────────────────────────────────────────
331 | (n+2) :=
id ┴┴
src ─┘ ┴
typ ─┘ ┴┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
332 have (2*a*y - y*y - 1 : ℤ) ∣ ↑(y^(n + 2)) - ↑(2 * a) * ↑(y^(n + 1)) + ↑(y^n), from
id ┴┴┴┴ ┴ ┴┴┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴┴┴┴ ┴ ┴┴┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴┴ ┴ ┴ ┴ ┴┴
333 ⟨-↑(y^n), by simp [nat.pow_succ, mul_add, int.coe_nat_mul,
id ┴┴ ┴┴ └──────────┘ └─────┘ └─────────────┘
src ┴┴ ┴ └────┘└──────────┘└┘└─────┘└┘└─────────────┘└─
typ ┴┴ ┴┴ └────┘└──────────┘└┘└─────┘└┘└─────────────┘└─
doc └────┘ └┘ └┘ └─
txt └────┘ └┘ └┘ └─
par └────┘ └┘ └┘ └─
pid ┴┴ └┘ └┘ └─
st └──────────────────────────────────────────────
334 show ((2:ℕ):ℤ) = 2, from rfl, mul_comm, mul_left_comm]⟩,
id ┴ └─┘ └──────┘ └───────────┘
src ───────┘ ┴ └┘ └┘ └┘┴└───────┘└─┘└┘└──────┘└┘└───────────┘┴
typ ───────┘ ┴ └┘ └┘ └┘┴└───────┘└─┘└┘└──────┘└┘└───────────┘┴
doc ───────┘ ┴ └┘ └┘ └┘ └───────┘ └┘ └┘ ┴
txt ───────┘ ┴ └┘ └┘ └┘ └───────┘ └┘ └┘ ┴
par ───────┘ ┴ └┘ └┘ └┘ └───────┘ └┘ └┘ ┴
pid ───────┘ ┴ └┘ └┘ └┘ └───────┘ └┘ └┘ ┴
st ─────────────────────────────────────────────────────────────┘
335 by rw [xz_succ_succ, yz_succ_succ, x_sub_y_dvd_pow_lem a1 ↑(y^(n+2)) ↑(y^(n+1)) ↑(y^n)]; exact
id └──────────┘ └──────────┘ └─────────────────┘ └┘ ┴ ┴ ┴ ┴ ┴
src └──┘└──────────┘└┘└──────────┘└┘└─────────────────┘┴ ┴┴ ┴ ┴└──┘ └──┘ └┘ └─────
typ └──┘└──────────┘└┘└──────────┘└┘└─────────────────┘┴└┘┴┴ ┴ ┴└──┘ └──┘ ┴ ┴└┘ └─────
doc └──┘ └┘ └┘ ┴ ┴ └──┘ └──┘ └┘ └─────
txt └──┘ └┘ └┘ ┴ ┴ └──┘ └──┘ └┘ └─────
par └──┘ └┘ └┘ ┴ ┴ └──┘ └──┘ └┘ └─────
pid └┘ └┘ └┘ ┴ ┴ └──┘ └──┘ └┘ └
st └───────────────┘└────────────┘└───────────────────────────────────────────────────┘┴└───────
336 dvd_sub (dvd_add this $ dvd_mul_of_dvd_right (x_sub_y_dvd_pow (n+1)) _) (x_sub_y_dvd_pow n)
id └─────┘ └─────┘ └──┘ └──────────────────┘ └─────────────┘ ┴
src ───┘└─────┘┴ └─────┘┴ ┴ ┴└──────────────────┘┴ ┴ └─────┘ ┴ └─
typ ───┘└─────┘┴ └─────┘┴└──┘┴ ┴└──────────────────┘┴ ┴ └─────┘ └─────────────┘┴┴└─
doc ───┘ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ └─
txt ───┘ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ └─
par ───┘ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ └─
pid ───┘ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴└
st ────────────────────────────────────────────────────────────────────────────────────────────────
337
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
338 theorem xn_modeq_x2n_add_lem (n j) : xn n ∣ d * yn n * (yn n * xn j) + xn j :=
id └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ └┘ ┴ ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ─┘ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘ └┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
339 have h1 : d * yn n * (yn n * xn j) + xn j = (d * yn n * yn n + 1) * xn j,
id ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
src ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘
typ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴
doc └┘ └┘ └┘ └┘ └┘ └┘ └┘
340 by simp [add_mul, mul_assoc],
id └─────┘ └───────┘
src └────┘└─────┘└┘└───────┘┴
typ └────┘└─────┘└┘└───────┘┴
doc └────┘ └┘ ┴
txt └────┘ └┘ ┴
par └────┘ └┘ ┴
pid ┴┴ └┘ ┴
st └────────────────────────┘
341 have h2 : d * yn n * yn n + 1 = xn n * xn n, by apply int.coe_nat_inj;
id ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └─────────────┘
src ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ └┘ └────┘└─────────────┘
typ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └────┘└─────────────┘
doc └┘ └┘ └┘ └┘ └────┘
txt └────┘
par └────┘
pid ┴
st └───────────────────────
342 repeat {rw int.coe_nat_add <|> rw int.coe_nat_mul}; exact
id └─────────────┘ └─────────────┘
src └──────┘└─┘└─────────────┘┴└──┘└─┘└─────────────┘┴ └─────
typ └──────┘└─┘└─────────────┘┴└──┘└─┘└─────────────┘┴ └─────
doc └──────┘└─┘ ┴└──┘└─┘ ┴ └─────
txt └──────┘└─┘ ┴└──┘└─┘ ┴ └─────
par └──────┘└─┘ ┴└──┘└─┘ ┴ └─────
pid └───┘ └──────┘ ┴ └
st ───────────┘└────────────────────────┘└───────────────┘└──────
343 add_eq_of_eq_sub' (eq.symm $ pell_eqz _ _),
id └───────────────┘ └─────┘ └──────┘
src ───┘└───────────────┘┴ └─────┘┴ ┴└──────┘└───┘
typ ───┘└───────────────┘┴ └─────┘┴ ┴└──────┘└───┘
doc ───┘ ┴ ┴ ┴ └───┘
txt ───┘ ┴ ┴ ┴ └───┘
par ───┘ ┴ ┴ ┴ └───┘
pid ───┘ ┴ ┴ ┴ └───┘
st ─────────────────────────────────────────────┘
344 by rw h2 at h1; rw [h1, mul_assoc]; exact dvd_mul_right _ _
id └┘ └┘ └───────┘ └───────────┘
src └─┘ └────┘ └──┘ └┘└───────┘┴ └────┘└───────────┘└────
typ └─┘└┘└────┘ └──┘└┘└┘└───────┘┴ └────┘└───────────┘└────
doc └─┘ └────┘ └──┘ └┘ ┴ └────┘ └────
txt └─┘ └────┘ └──┘ └┘ ┴ └────┘ └────
par └─┘ └────┘ └──┘ └┘ ┴ └────┘ └────
pid ┴ └────┘ └┘ └┘ ┴ ┴ └──┘└
st └────────────────┘└┘└─────────┘┴└─────────────────────────
345
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
346 theorem xn_modeq_x2n_add (n j) : xn (2 * n + j) + xn j ≡ 0 [MOD xn n] :=
id └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴
src ─┘ └┘ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴
typ ─┘ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴
doc ─┘ └┘ └┘ ┴ └──┘ └┘ ┴
txt ─┘
par ─┘
pid ─┘
st ─┘
347 by rw [two_mul, add_assoc, xn_add, add_assoc]; exact
id └─────┘ └───────┘ └────┘ └───────┘
src └──┘└─────┘└┘└───────┘└┘└────┘└┘└───────┘┴ └─────
typ └──┘└─────┘└┘└───────┘└┘└────┘└┘└───────┘┴ └─────
doc └──┘ └┘ └┘ └┘ ┴ └─────
txt └──┘ └┘ └┘ └┘ ┴ └─────
par └──┘ └┘ └┘ └┘ ┴ └─────
pid └┘ └┘ └┘ └┘ ┴ └
st └──────────┘└─────────┘└──────┘└─────────┘┴└───────
348 show _ ≡ 0+0 [MOD xn a1 n], from modeq.modeq_add (modeq.modeq_zero_iff.2 $ dvd_mul_right (xn a1 n) (xn a1 (n + j))) $
id ┴ ┴ └──┘ ┴ └─────────────┘ └──────────────────┘ └───────────┘ └┘ └┘ ┴ ┴
src ─┘ └─┘ └┘┴└┘ ┴ ┴ ┴ └─────┘└─────────────┘┴ └──────────────────┘└─┘ ┴└───────────┘┴ ┴ ┴ └┘ └┘┴ ┴ ┴ ┴ └──┘ └
typ ─┘ └─┘┴└┘┴└┘└──┘┴ ┴ ┴ ┴└─────┘└─────────────┘┴ └──────────────────┘└─┘ ┴└───────────┘┴ ┴ ┴ └┘ └┘┴└┘┴ ┴┴ ┴┴└──┘ └
doc ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ ┴ ┴ └┘ └┘┴ ┴ ┴ ┴ └──┘ └
txt ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └──┘ └
par ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └──┘ └
pid ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └──┘ └
st ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
349 by rw [yn_add, left_distrib, add_assoc]; exact
id └────┘ └──────────┘ └───────┘
src ─┘ ┴└──┘└────┘└┘└──────────┘└┘└───────┘┴└───────
typ ─┘ ┴└──┘└────┘└┘└──────────┘└┘└───────┘┴└───────
doc ─┘ ┴└──┘ └┘ └┘ ┴└───────
txt ─┘ ┴└──┘ └┘ └┘ ┴└───────
par ─┘ ┴└──┘ └┘ └┘ ┴└───────
pid ─┘ └───┘ └┘ └┘ └────────
st ───┘└─────────┘└────────────┘└─────────┘┴└───────
350 show _ ≡ 0+0 [MOD xn a1 n], from modeq.modeq_add (modeq.modeq_zero_iff.2 $ dvd_mul_of_dvd_right (dvd_mul_right _ _) _) $
id ┴ └──┘ └┘ └┘ ┴┴ └─────────────┘ └──────────────────┘ └───────────┘
src ─┘ └─┘ └┘ └┘ ┴└┘┴ ┴ └─────┘└─────────────┘┴ └─┘ ┴└──────────────────┘┴ └───────────┘└───────┘ └
typ ─┘ └─┘┴└┘ └┘└──┘┴└┘┴└┘┴┴┴└─────┘└─────────────┘┴ └─┘ ┴└──────────────────┘┴ └───────────┘└───────┘ └
doc ─┘ └─┘ └┘ └┘ ┴└┘┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ └───────┘ └
txt ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ └───────┘ └
par ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ └───────┘ └
pid ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ ┴ └───────┘ └
st ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
351 modeq.modeq_zero_iff.2 $ xn_modeq_x2n_add_lem _ _ _
id └──────────────────┘ └──────────────────┘
src ─┘└──────────────────┘└─┘ ┴└──────────────────┘└──────
typ ─┘└──────────────────┘└─┘ ┴└──────────────────┘└──────
doc ─┘ └─┘ ┴ └──────
txt ─┘ └─┘ ┴ └──────
par ─┘ └─┘ ┴ └──────
pid ─┘ └─┘ ┴ └──────
st ──────────────────────────────────────────────────────
352
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
353 lemma xn_modeq_x2n_sub_lem {n j} (h : j ≤ n) : xn (2 * n - j) + xn j ≡ 0 [MOD xn n] :=
id ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴
src ─┘ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴
typ ─┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴
doc ─┘ └┘ └┘ ┴ └──┘ └┘ ┴
txt ─┘
par ─┘
pid ─┘
st ─┘
354 have h1 : xz n ∣ ↑d * yz n * yz (n - j) + xz j, by rw [yz_sub _ h, mul_sub_left_distrib, sub_add_eq_add_sub]; exact
id └┘ ┴ ┴ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ └────┘ ┴ └──────────────────┘ └────────────────┘
src └┘ ┴ ┴┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ └──┘└────┘└─┘ └┘└──────────────────┘└┘└────────────────┘┴ └─────
typ └┘ ┴ ┴ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └┘ ┴ └──┘└────┘└─┘┴└┘└──────────────────┘└┘└────────────────┘┴ └─────
doc └──┘ └─┘ └┘ └┘ ┴ └─────
txt └──┘ └─┘ └┘ └┘ ┴ └─────
par └──┘ └─┘ └┘ └┘ ┴ └─────
pid └┘ └─┘ └┘ └┘ ┴ └
st └─────────────┘└────────────────────┘└──────────────────┘┴└───────
355 dvd_sub
id └─────┘
src ─┘└─────┘└
typ ─┘└─────┘└
doc ─┘ └
txt ─┘ └
par ─┘ └
pid ─┘ └
st ──────────
356 (by delta xz; delta yz;
src ───┘ ┴└──────┘└┘└──────┘└─
typ ───┘ ┴└──────┘└┘└──────┘└─
doc ───┘ ┴└──────┘└┘└──────┘└─
txt ───┘ ┴└──────┘└┘└──────┘└─
par ───┘ ┴└──────┘└┘└──────┘└─
pid ───┘ └────────────────────
st ──────┘└────────────────────
357 repeat {rw ← int.coe_nat_add <|> rw ← int.coe_nat_mul}; rw mul_comm (xn a1 j) (yn a1 n);
id └─────────────┘ └─────────────┘ └──────┘ └┘ ┴ └┘ └┘ ┴
src ───────┘└──────┘└───┘└─────────────┘┴└──┘└───┘└─────────────┘┴└┘└─┘└──────┘┴ └┘┴ ┴ └┘ └┘┴ ┴ ┴└─
typ ───────┘└──────┘└───┘└─────────────┘┴└──┘└───┘└─────────────┘┴└┘└─┘└──────┘┴ └┘┴ ┴┴└┘ └┘┴└┘┴┴┴└─
doc ───────┘└──────┘└───┘ ┴└──┘└───┘ ┴└┘└─┘ ┴ └┘┴ ┴ └┘ └┘┴ ┴ ┴└─
txt ───────┘└──────┘└───┘ ┴└──┘└───┘ ┴└┘└─┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴└─
par ───────┘└──────┘└───┘ ┴└──┘└───┘ ┴└┘└─┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴└─
pid ────────────────────┘ └────────┘ └────┘ ┴ ┴ ┴ └┘ ┴ ┴ └──
st ───────────────┘└───────────────────────────────────────────┘┴└───┘└──────┘└─────────────────────
358 exact int.coe_nat_dvd.2 (xn_modeq_x2n_add_lem _ _ _))
id └─────────────┘ └──────────────────┘
src ─────────────┘└─────────────┘└─┘ └──────────────────┘└────────
typ ─────────────┘└─────────────┘└─┘ └──────────────────┘└────────
doc ─────────────┘ └─┘ └────────
txt ─────────────┘ └─┘ └────────
par ─────────────┘ └─┘ └────────
pid ─────────────┘ └─┘ └────────
st ───────────────────────────────────────────────────────────┘└─
359 (dvd_mul_of_dvd_right (dvd_mul_right _ _) _),
id └──────────────────┘ └───────────┘
src ───┘ └──────────────────┘┴ └───────────┘└──────┘
typ ───┘ └──────────────────┘┴ └───────────┘└──────┘
doc ───┘ ┴ └──────┘
txt ───┘ ┴ └──────┘
par ───┘ ┴ └──────┘
pid ───┘ ┴ └──────┘
st ───────────────────────────────────────────────┘
360 by rw [two_mul, nat.add_sub_assoc h, xn_add, add_assoc]; exact
id └─────┘ └───────────────┘ ┴ └────┘ └───────┘
src └──┘└─────┘└┘└───────────────┘┴ └┘└────┘└┘└───────┘┴ └─────
typ └──┘└─────┘└┘└───────────────┘┴┴└┘└────┘└┘└───────┘┴ └─────
doc └──┘ └┘ ┴ └┘ └┘ ┴ └─────
txt └──┘ └┘ ┴ └┘ └┘ ┴ └─────
par └──┘ └┘ ┴ └┘ └┘ ┴ └─────
pid └┘ └┘ ┴ └┘ └┘ ┴ └
st └──────────┘└───────────────────┘└──────┘└─────────┘┴└───────
361 show _ ≡ 0+0 [MOD xn a1 n], from modeq.modeq_add (modeq.modeq_zero_iff.2 $ dvd_mul_right _ _) $
id ┴ ┴ └──┘ └┘ └┘ ┴┴ └─────────────┘ └───────────┘
src ─┘ └─┘ └┘┴└┘ ┴└┘┴ ┴ └─────┘└─────────────┘┴ └─┘ ┴└───────────┘└────┘ └
typ ─┘ └─┘┴└┘┴└┘└──┘┴└┘┴└┘┴┴┴└─────┘└─────────────┘┴ └─┘ ┴└───────────┘└────┘ └
doc ─┘ └─┘ └┘ └┘ ┴└┘┴ ┴ └─────┘ ┴ └─┘ ┴ └────┘ └
txt ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ └────┘ └
par ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ └────┘ └
pid ─┘ └─┘ └┘ └┘ ┴ ┴ ┴ └─────┘ ┴ └─┘ ┴ └────┘ └
st ──────────────────────────────────────────────────────────────────────────────────────────────────
362 modeq.modeq_zero_iff.2 $ int.coe_nat_dvd.1 $ by simpa [xz, yz] using h1
id └──────────────────┘ └─────────────┘ └┘ └┘ └┘
src ─┘└──────────────────┘└─┘ ┴└─────────────┘└─┘ ┴ ┴└─────┘└┘└┘└┘└──────┘ └
typ ─┘└──────────────────┘└─┘ ┴└─────────────┘└─┘ ┴ ┴└─────┘└┘└┘└┘└──────┘└┘└
doc ─┘ └─┘ ┴ └─┘ ┴ ┴└─────┘ └┘ └──────┘ └
txt ─┘ └─┘ ┴ └─┘ ┴ ┴└─────┘ └┘ └──────┘ └
par ─┘ └─┘ ┴ └─┘ ┴ ┴└─────┘ └┘ └──────┘ └
pid ─┘ └─┘ ┴ └─┘ ┴ └──────┘ └┘ └──────┘ └
st ────────────────────────────────────────────────┘└────────────────────────
363
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
364 theorem xn_modeq_x2n_sub {n j} (h : j ≤ 2 * n) : xn (2 * n - j) + xn j ≡ 0 [MOD xn n] :=
id ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴
src ─┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴
typ ─┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └┘ ┴┴
doc ─┘ └┘ └┘ ┴ └──┘ └┘ ┴
txt ─┘
par ─┘
pid ─┘
st ─┘
365 (le_total j n).elim xn_modeq_x2n_sub_lem
id └──────┘ ┴ ┴ └──┘ └──────────────────┘
src └──────┘ └──┘ └──────────────────┘
typ └──────┘ ┴ ┴ └──┘ └──────────────────┘
366 (λjn, have 2 * n - j + j ≤ n + j, by rw [nat.sub_add_cancel h, two_mul]; exact nat.add_le_add_left jn _,
id └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────────────┘ ┴ └─────┘ └─────────────────┘ └┘
src ┴ ┴ ┴ ┴ ┴ └──┘└────────────────┘┴ └┘└─────┘┴ └────┘└─────────────────┘┴ └┘
typ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──┘└────────────────┘┴┴└┘└─────┘┴ └────┘└─────────────────┘┴└┘└┘
doc └──┘ ┴ └┘ ┴ └────┘ ┴ └┘
txt └──┘ ┴ └┘ ┴ └────┘ ┴ └┘
par └──┘ ┴ └┘ ┴ └────┘ ┴ └┘
pid └┘ ┴ └┘ ┴ ┴ ┴ └┘
st └───────────────────────┘└───────┘┴└──────────────────────────────┘
367 let t := xn_modeq_x2n_sub_lem (nat.le_of_add_le_add_right this) in by rwa [nat.sub_sub_self h, add_comm] at t)
id ┴ └──────────────────┘ └────────────────────────┘ └──┘ └──────────────┘ ┴ └──────┘
src └──────────────────┘ └────────────────────────┘ └───┘└──────────────┘┴ └┘└──────┘└────┘
typ ┴ └──────────────────┘ └────────────────────────┘ └──┘ └───┘└──────────────┘┴┴└┘└──────┘└────┘
doc └───┘ ┴ └┘ └────┘
txt └───┘ ┴ └┘ └────┘
par └───┘ ┴ └┘ └────┘
pid └┘ ┴ └┘ ┴└───┘
st └──────────────────────┘└────────┘┴└───┘
368
369 theorem xn_modeq_x4n_add (n j) : xn (4 * n + j) ≡ xn j [MOD xn n] :=
id └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src └┘ ┴ ┴ ┴ └┘ └──┘ └┘ ┴
typ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
370 modeq.modeq_add_cancel_right (modeq.refl $ xn (2 * n + j)) $
id └──────────────────────────┘ └────────┘ └┘ ┴ ┴ ┴ ┴
src └──────────────────────────┘ └────────┘ └┘ ┴ ┴
typ └──────────────────────────┘ └────────┘ └┘ ┴ ┴ ┴ ┴
doc └┘
371 by refine @modeq.trans _ _ 0 _ _ (by rw add_comm; exact (xn_modeq_x2n_add _ _ _).symm);
id └─────────┘ └──────┘ └──────────────┘
src └─────┘ └─────────┘└─────────┘ ┴└─┘└──────┘└┘└────┘ └──────────────┘└──────────┘┴
typ └─────┘ └─────────┘└─────────┘ ┴└─┘└──────┘└──────┘ └──────────────┘└───────────┘
doc └─────┘ └─────────┘ ┴└─┘ └┘└────┘ └──────────┘┴
txt └─────┘ └─────────┘ ┴└─┘ └┘└────┘ └──────────┘┴
par └─────┘ └─────────┘ ┴└─┘ └──────┘ └───────────┘
pid ┴ └─────────┘ └──┘ └──────┘ └───────────┘
st └────────────────────────────────┘└───────────────────────────────────────────────┘└──
372 rw [show 4*n = 2*n + 2*n, from right_distrib 2 2 n, add_assoc]; apply xn_modeq_x2n_add
id ┴ ┴ ┴ └───────────┘ ┴ └───────┘ └──────────────┘
src └──┘ └┘┴ ┴┴└┘ ┴┴└┘ └─────┘└───────────┘└───┘ └┘└───────┘┴ └────┘└──────────────┘└
typ └──┘ └┘┴ ┴┴└┘ ┴┴└┘ └─────┘└───────────┘└───┘┴└┘└───────┘┴ └────┘└──────────────┘└
doc └──┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ └────┘ └
txt └──┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ └────┘ └
par └──┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ └────┘ └
pid └┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ ┴ └
st ────────┘└────────────────────────────────────────────┘└─────────┘┴└────────────────────────
373
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
374 theorem xn_modeq_x4n_sub {n j} (h : j ≤ 2 * n) : xn (4 * n - j) ≡ xn j [MOD xn n] :=
id ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src ─┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └──┘ └┘ ┴
typ ─┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc ─┘ └┘ ┴ └┘ └──┘ └┘ ┴
txt ─┘
par ─┘
pid ─┘
st ─┘
375 have h' : j ≤ 2*n, from le_trans h (by rw nat.succ_mul; apply nat.le_add_left),
id ┴ ┴ ┴┴ └──────┘ ┴ └──────────┘
src ┴ ┴ └──────┘ └─┘└──────────┘ └────┘
typ ┴ ┴ ┴┴ └──────┘ ┴ └─┘└──────────┘ └────┘
doc └─┘ └────┘
txt └─┘ └────┘
par └─┘ └────┘
pid ┴ ┴
st └─────────────────────────────────────┘
376 modeq.modeq_add_cancel_right (modeq.refl $ xn (2 * n - j)) $
id └──────────────────────────┘ └────────┘ └┘ ┴ ┴ ┴ ┴
src └──────────────────────────┘ └────────┘ └┘ ┴ ┴
typ └──────────────────────────┘ └────────┘ └┘ ┴ ┴ ┴ ┴
doc └┘
377 by refine @modeq.trans _ _ 0 _ _ (by rw add_comm; exact (xn_modeq_x2n_sub _ h).symm);
id └─────────┘ └──────┘ └──────────────┘ ┴
src └─────┘ └─────────┘└─────────┘ ┴└─┘└──────┘└┘└────┘ └──────────────┘└─┘ └────┘┴
typ └─────┘ └─────────┘└─────────┘ ┴└─┘└──────┘└──────┘ └──────────────┘└─┘┴└─────┘
doc └─────┘ └─────────┘ ┴└─┘ └┘└────┘ └─┘ └────┘┴
txt └─────┘ └─────────┘ ┴└─┘ └┘└────┘ └─┘ └────┘┴
par └─────┘ └─────────┘ ┴└─┘ └──────┘ └─┘ └─────┘
pid ┴ └─────────┘ └──┘ └──────┘ └─┘ └─────┘
st └────────────────────────────────┘└─────────────────────────────────────────────┘└──
378 rw [show 4*n = 2*n + 2*n, from right_distrib 2 2 n, nat.add_sub_assoc h']; apply xn_modeq_x2n_add
id ┴ ┴ ┴ └───────────┘ ┴ └───────────────┘ └┘ └──────────────┘
src └──┘ └┘┴ ┴┴└┘ ┴┴└┘ └─────┘└───────────┘└───┘ └┘└───────────────┘┴ ┴ └────┘└──────────────┘└
typ └──┘ └┘┴ ┴┴└┘ ┴┴└┘ └─────┘└───────────┘└───┘┴└┘└───────────────┘┴└┘┴ └────┘└──────────────┘└
doc └──┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ ┴ └────┘ └
txt └──┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ ┴ └────┘ └
par └──┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ ┴ └────┘ └
pid └┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ └┘ ┴ ┴ ┴ └
st ────────┘└────────────────────────────────────────────┘└────────────────────┘┴└────────────────────────
379
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
380 theorem eq_of_xn_modeq_lem1 {i n} : Π {j}, i < j → j < n → xn i % xn n < xn j % xn n
id ┴┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ─┘ ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ─┘ ┴┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc ─┘ └┘ └┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
381 | 0 ij _ := absurd ij (nat.not_lt_zero _)
id └┘ └────┘ └─────────────┘
src └────┘ └─────────────┘
typ └┘ └────┘ └─────────────┘
382 | (j+1) ij jn :=
id ┴┴ └┘ └┘
src ┴
typ ┴┴ └┘ └┘
383 suffices xn j % xn n < xn (j + 1) % xn n, from
id └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src └┘ ┴ └┘ ┴ └┘ ┴ ┴ └┘
typ └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc └┘ └┘ └┘ └┘
384 (lt_or_eq_of_le (nat.le_of_succ_le_succ ij)).elim
id └────────────┘ └────────────────────┘ └──┘
src └────────────┘ └────────────────────┘ └──┘
typ └────────────┘ └────────────────────┘ └──┘
385 (λh, lt_trans (eq_of_xn_modeq_lem1 h (le_of_lt jn)) this)
id ┴ └──────┘ └─────────────────┘ ┴ └──────┘ └──┘
src └──────┘ └──────┘
typ ┴ └──────┘ └─────────────────┘ ┴ └──────┘ └──┘
386 (λh, by rw h; exact this),
id ┴ ┴ └──┘
src └─┘ └────┘
typ ┴ └─┘┴ └────┘└──┘
doc └─┘ └────┘
txt └─┘ └────┘
par └─┘ └────┘
pid ┴ ┴
st └───────────────┘
387 by rw [nat.mod_eq_of_lt (x_increasing _ (nat.lt_of_succ_lt jn)), nat.mod_eq_of_lt (x_increasing _ jn)];
id └──────────────┘ └──────────┘ └───────────────┘ └┘ └──────────────┘ └──────────┘ └┘
src └──┘└──────────────┘┴ └──────────┘└─┘ └───────────────┘┴ └──┘└──────────────┘┴ └──────────┘└─┘ └┘
typ └──┘└──────────────┘┴ └──────────┘└─┘ └───────────────┘┴└┘└──┘└──────────────┘┴ └──────────┘└─┘└┘└┘
doc └──┘ ┴ └─┘ ┴ └──┘ ┴ └─┘ └┘
txt └──┘ ┴ └─┘ ┴ └──┘ ┴ └─┘ └┘
par └──┘ ┴ └─┘ ┴ └──┘ ┴ └─┘ └┘
pid └┘ ┴ └─┘ ┴ └──┘ ┴ └─┘ └┘
st └───────────────────────────────────────────────────────────┘└────────────────────────────────────┘┴└─
388 exact x_increasing _ (nat.lt_succ_self _)
id └──────────┘ └──────────────┘
src └────┘└──────────┘└─┘ └──────────────┘└───
typ └────┘└──────────┘└─┘ └──────────────┘└───
doc └────┘ └─┘ └───
txt └────┘ └─┘ └───
par └────┘ └─┘ └───
pid ┴ └─┘ └─┘└
st ─────────────────────────────────────────────────
389
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
390 theorem eq_of_xn_modeq_lem2 {n} (h : 2 * xn n = xn (n + 1)) : a = 2 ∧ n = 0 :=
id ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ─┘ ┴ └┘ ┴ └┘ ┴ ┴ ┴ ┴
typ ─┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴
doc ─┘ └┘ └┘
txt ─┘
par ─┘
pid ─┘
st ─┘
391 by rw [xn_succ, mul_comm] at h; exact
id └─────┘ └──────┘
src └──┘└─────┘└┘└──────┘└────┘ └─────
typ └──┘└─────┘└┘└──────┘└────┘ └─────
doc └──┘ └┘ └────┘ └─────
txt └──┘ └┘ └────┘ └─────
par └──┘ └┘ └────┘ └─────
pid └┘ └┘ ┴└───┘ └
st └──────────┘└────────┘┴└────────────
392 have n = 0, from n.eq_zero_or_pos.resolve_right $ λnp,
id ┴ └────────────────────────────┘
src ─┘ └─┘┴└───────┘└────────────────────────────┘┴ ┴ └───
typ ─┘ └─┘┴└───────┘└────────────────────────────┘┴ ┴ └───
doc ─┘ └─┘ └───────┘ ┴ ┴ └───
txt ─┘ └─┘ └───────┘ ┴ ┴ └───
par ─┘ └─┘ └───────┘ ┴ ┴ └───
pid ─┘ └─┘ └───────┘ ┴ ┴ └───
st ─────────────────────────────────────────────────────────
393 ne_of_lt (lt_of_le_of_lt (nat.mul_le_mul_left _ a1)
id └──────┘ └────────────┘ └─────────────────┘
src ───┘└──────┘┴ └────────────┘┴ └─────────────────┘└─┘ └─
typ ───┘└──────┘┴ └────────────┘┴ └─────────────────┘└─┘ └─
doc ───┘ ┴ ┴ └─┘ └─
txt ───┘ ┴ ┴ └─┘ └─
par ───┘ ┴ ┴ └─┘ └─
pid ───┘ ┴ ┴ └─┘ └─
st ────────────────────────────────────────────────────────
394 (nat.lt_add_of_pos_right $ mul_pos (d_pos a1) (y_increasing a1 np))) h,
id └─────────────────────┘ └─────┘ └───┘ └──────────┘ └┘ ┴
src ─────┘ └─────────────────────┘┴ ┴└─────┘┴ └───┘┴ └┘ └──────────┘┴ ┴ └──┘ └─
typ ─────┘ └─────────────────────┘┴ ┴└─────┘┴ └───┘┴ └┘ └──────────┘┴└┘┴ └──┘┴└─
doc ─────┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └─
txt ─────┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └─
par ─────┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └─
pid ─────┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └──┘ └─
st ──────────────────────────────────────────────────────────────────────────────
395 by cases this; simp at h; exact ⟨h.symm, rfl⟩
id └──┘ └────┘ └─┘
src ─┘ ┴└────┘ └┘└───────┘└──────┘ └────┘└┘└─┘└─
typ ─┘ ┴└────┘└──┘└┘└───────┘└──────┘ └────┘└┘└─┘└─
doc ─┘ ┴└────┘ └┘└───────┘└──────┘ └┘ └─
txt ─┘ ┴└────┘ └┘└───────┘└──────┘ └┘ └─
par ─┘ ┴└────┘ └┘└───────┘└──────┘ └┘ └─
pid ─┘ └─────┘ └─────────────────┘ └┘ └─
st ───┘└───────────────────────────────────────────
396
src ─
typ ─
doc ─
txt ─
par ─
pid ─
st ─
397 theorem eq_of_xn_modeq_lem3 {i n} (npos : n > 0) :
id ┴ ┴
src ─┘ ┴
typ ─┘ ┴ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
398 Π {j}, i < j → j ≤ 2 * n → j ≠ n → ¬(a = 2 ∧ n = 1 ∧ i = 0 ∧ j = 2) → xn i % xn n < xn j % xn n
id ┴┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └┘ ┴ └┘ ┴ └┘
typ ┴┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴
doc └┘ └┘ └┘ └┘
399 | 0 ij _ _ _ := absurd ij (nat.not_lt_zero _)
id └┘ └────┘ └─────────────┘
src └────┘ └─────────────┘
typ └┘ └────┘ └─────────────┘
400 | (j+1) ij j2n jnn ntriv :=
id ┴┴ └┘ └─┘ └─┘
src ┴
typ ┴┴ └┘ └─┘ └─┘
401 have lem2 : ∀k > n, k ≤ 2*n → (↑(xn k % xn n) : ℤ) = xn n - xn (2 * n - k), from λk kn k2n,
id ┴ ┴ ┴ ┴ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ └─┘
src ┴ ┴ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ └┘ └─┘
doc └┘ └┘ └┘ └┘
402 let k2nl := lt_of_add_lt_add_right $ show 2*n-k+k < n+k, by
id └──┘ └────────────────────┘ ┴┴┴┴┴┴ ┴ ┴┴┴
src └────────────────────┘ ┴ ┴ ┴ ┴ ┴
typ └──┘ └────────────────────┘ ┴┴┴┴┴┴ ┴ ┴┴┴
st └
403 {rw nat.sub_add_cancel, rw two_mul; exact (add_lt_add_left kn n), exact k2n } in
id └────────────────┘ └─────┘ └─────────────┘ └┘ ┴ └─┘
src └─┘└────────────────┘ └─┘└─────┘ └────┘ └─────────────┘┴ ┴ ┴ └────┘ ┴
typ └─┘└────────────────┘ └─┘└─────┘ └────┘ └─────────────┘┴└┘┴┴┴ └────┘└─┘┴
doc └─┘ └─┘ └────┘ ┴ ┴ ┴ └────┘ ┴
txt └─┘ └─┘ └────┘ ┴ ┴ ┴ └────┘ ┴
par └─┘ └─┘ └────┘ ┴ ┴ ┴ └────┘ ┴
pid ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
st ─────────────────────────────┘└────────────────────────────────────────┘└──────────┘└┘
404 have xle : xn (2 * n - k) ≤ xn n, from le_of_lt $ x_increasing k2nl,
id └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──────┘ └──────────┘ └──┘
src └┘ ┴ ┴ ┴ └┘ └──────┘ └──────────┘
typ └┘ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──────┘ └──────────┘ └──┘
doc └┘ └┘
405 suffices xn k % xn n = xn n - xn (2 * n - k), by rw [this, int.coe_nat_sub xle],
id └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └──┘ └─────────────┘ └─┘
src └┘ ┴ └┘ ┴ └┘ ┴ └┘ ┴ ┴ └──┘ └┘└─────────────┘┴ ┴
typ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ └──┘└──┘└┘└─────────────┘┴└─┘┴
doc └┘ └┘ └┘ └┘ └──┘ └┘ ┴ ┴
txt └──┘ └┘ ┴ ┴
par └──┘ └┘ ┴ ┴
pid └┘ └┘ ┴ ┴
st └───────┘└───────────────────┘┴
406 by {
st └──
407 rw ← nat.mod_eq_of_lt (nat.sub_lt (x_pos a1 n) (x_pos a1 (2 * n - k))),
id └──────────────┘ └────────┘ └───┘ └┘ ┴ ┴ ┴ ┴
src └───┘└──────────────┘┴ └────────┘┴ ┴ ┴ └┘ └───┘┴ ┴ └┘┴┴ ┴┴┴ └─┘
typ └───┘└──────────────┘┴ └────────┘┴ ┴ ┴ └┘ └───┘┴└┘┴ └┘┴┴┴┴┴┴┴└─┘
doc └───┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
txt └───┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
par └───┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
pid └─┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
st ─────────────────────────────────────────────────────────────────────────────┘└─
408 apply modeq.modeq_add_cancel_right (modeq.refl (xn a1 (2 * n - k))),
id └──────────────────────────┘ └────────┘ └┘ └┘ ┴ ┴
src └────┘└──────────────────────────┘┴ └────────┘┴ └┘┴ ┴ └┘ ┴ ┴ ┴ └─┘
typ └────┘└──────────────────────────┘┴ └────────┘┴ └┘┴└┘┴ └┘ ┴┴┴ ┴┴└─┘
doc └────┘ ┴ ┴ └┘┴ ┴ └┘ ┴ ┴ ┴ └─┘
txt └────┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
par └────┘ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
pid ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─┘
st ──────────────────────────────────────────────────────────────────────────┘└─
409 rw [nat.sub_add_cancel xle],
id └────────────────┘ └─┘
src └──┘└────────────────┘┴ ┴
typ └──┘└────────────────┘┴└─┘┴
doc └──┘ ┴ ┴
txt └──┘ ┴ ┴
par └──┘ ┴ ┴
pid └┘ ┴ ┴
st ─────────────────────────────────┘└──
410 have t := xn_modeq_x2n_sub_lem a1 (le_of_lt k2nl),
id └──────────────────┘ └┘ └──────┘ └──┘
src └────────┘└──────────────────┘┴ ┴ └──────┘┴ ┴
typ └────────┘└──────────────────┘┴└┘┴ └──────┘┴└──┘┴
doc └────────┘ ┴ ┴ ┴ ┴
txt └────────┘ ┴ ┴ ┴ ┴
par └────────┘ ┴ ┴ ┴ ┴
pid └────┘┴└─┘ ┴ ┴ ┴ ┴
st ────────────────────────────────────────────────────────┘└─
411 rw nat.sub_sub_self k2n at t,
id └──────────────┘ └─┘
src └─┘└──────────────┘┴ └───┘
typ └─┘└──────────────┘┴└─┘└───┘
doc └─┘ ┴ └───┘
txt └─┘ ┴ └───┘
par └─┘ ┴ └───┘
pid ┴ ┴ └───┘
st ───────────────────────────────────┘└─
412 exact t.trans (modeq.modeq_zero_iff.2 $ dvd_refl _).symm },
id └─────┘ └──────────────────┘ └──────┘
src └────┘└─────┘┴ └──────────────────┘└─┘ ┴└──────┘└───────┘
typ └────┘└─────┘┴ └──────────────────┘└─┘ ┴└──────┘└───────┘
doc └────┘ ┴ └─┘ ┴ └───────┘
txt └────┘ ┴ └─┘ ┴ └───────┘
par └────┘ ┴ └─┘ ┴ └───────┘
pid ┴ ┴ └─┘ ┴ └─────┘└┘
st ────────────────────────────────────────────────────────────────┘└┘
413 (lt_trichotomy j n).elim
id └───────────┘ ┴ └──┘
src └───────────┘ └──┘
typ └───────────┘ ┴ └──┘
414 (λ (jn : j < n), eq_of_xn_modeq_lem1 ij (lt_of_le_of_ne jn jnn)) $ λo, o.elim
id ┴ ┴ └─────────────────┘ └────────────┘ └┘ ┴ ┴└───┘
src ┴ └─────────────────┘ └────────────┘ └───┘
typ ┴ ┴ └─────────────────┘ └────────────┘ └┘ ┴ ┴└───┘
415 (λ (jn : j = n), by {
id ┴ ┴
src ┴
typ ┴ ┴
st └──
416 cases jn,
id └┘
src └────┘
typ └────┘└┘
doc └────┘
txt └────┘
par └────┘
pid ┴
st ─────────────┘└─
417 apply int.lt_of_coe_nat_lt_coe_nat,
id └──────────────────────────┘
src └────┘└──────────────────────────┘
typ └────┘└──────────────────────────┘
doc └────┘
txt └────┘
par └────┘
pid ┴
st ───────────────────────────────────────┘└─
418 rw [lem2 (n+1) (nat.lt_succ_self _) j2n,
id └──┘ ┴┴ └──────────────┘ └─┘
src └──┘ ┴ ┴└─┘ └──────────────┘└──┘ └─
typ └──┘└──┘┴ ┴┴└─┘ └──────────────┘└──┘└─┘└─
doc └──┘ ┴ └─┘ └──┘ └─
txt └──┘ ┴ └─┘ └──┘ └─
par └──┘ ┴ └─┘ └──┘ └─
pid └┘ ┴ └─┘ └──┘ └─
st ────────────────────────────────────────────┘└─
419 show 2 * n - (n + 1) = n - 1, by rw[two_mul, ← nat.sub_sub, nat.add_sub_cancel]],
id ┴ ┴ └─────┘ └─────────┘ └────────────────┘
src ─────────┘ └─┘ ┴ ┴ ┴ ┴ └──┘┴┴ ┴ └────────┘└─────┘└──┘└─────────┘└┘└────────────────┘└┘
typ ─────────┘ └─┘ ┴ ┴ ┴ ┴ └──┘┴┴┴┴ └────────┘└─────┘└──┘└─────────┘└┘└────────────────┘└┘
doc ─────────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └────────┘ └──┘ └┘ └┘
txt ─────────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └────────┘ └──┘ └┘ └┘
par ─────────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └────────┘ └──┘ └┘ └┘
pid ─────────┘ └─┘ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └────────┘ └──┘ └┘ └┘
st ─────────────────────────────────────────┘└─────────┘└─────────────┘└──────────────────┘┴└──
420 refine lt_sub_left_of_add_lt (int.coe_nat_lt_coe_nat_of_lt _),
id └───────────────────┘ └──────────────────────────┘
src └─────┘└───────────────────┘┴ └──────────────────────────┘└─┘
typ └─────┘└───────────────────┘┴ └──────────────────────────┘└─┘
doc └─────┘ ┴ └─┘
txt └─────┘ ┴ └─┘
par └─────┘ ┴ └─┘
pid ┴ ┴ └─┘
st ──────────────────────────────────────────────────────────────────┘└─
421 cases (lt_or_eq_of_le $ nat.le_of_succ_le_succ ij) with lin ein,
id └────────────┘ └────────────────────┘ └┘
src └────┘ └────────────┘┴ ┴└────────────────────┘┴ └────────────┘
typ └────┘ └────────────┘┴ ┴└────────────────────┘┴└┘└────────────┘
doc └────┘ ┴ ┴ ┴ └────────────┘
txt └────┘ ┴ ┴ ┴ └────────────┘
par └────┘ ┴ ┴ ┴ └────────────┘
pid ┴ ┴ ┴ ┴ ┴└───────────┘
st ────────────────────────────────────────────────────────────────────┘└─
422 { rw nat.mod_eq_of_lt (x_increasing _ lin),
id └──────────────┘ └──────────┘ └─┘
src └─┘└──────────────┘┴ └──────────┘└─┘ ┴
typ └─┘└──────────────┘┴ └──────────┘└─┘└─┘┴
doc └─┘ ┴ └─┘ ┴
txt └─┘ ┴ └─┘ ┴
par └─┘ ┴ └─┘ ┴
pid ┴ ┴ └─┘ ┴
st ───────┘└──────────────────────────────────────┘└─
423 have ll : xn a1 (n-1) + xn a1 (n-1) ≤ xn a1 n,
id ┴ └┘ └┘ ┴
src └────────┘ ┴ ┴ └─┘ ┴ ┴ ┴ └─┘┴┴└┘┴ ┴
typ └────────┘ ┴ ┴ └─┘ ┴ ┴ ┴ └─┘┴┴└┘┴└┘┴┴
doc └────────┘ ┴ ┴ └─┘ ┴ ┴ ┴ └─┘ ┴└┘┴ ┴
txt └────────┘ ┴ ┴ └─┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴
par └────────┘ ┴ ┴ └─┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴
pid └─────┘└─┘ ┴ ┴ └─┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴
st ────────────────────────────────────────────────────┘└─
424 { rw [← two_mul, mul_comm, show xn a1 n = xn a1 (n-1+1), by rw [nat.sub_add_cancel npos], xn_succ],
id └─────┘ └──────┘ ┴ └┘ └┘ ┴ └────────────────┘ └──┘ └─────┘
src └────┘└─────┘└┘└──────┘└┘ ┴ ┴ ┴ ┴ ┴└┘┴ ┴ ┴ └─────────┘└────────────────┘┴ └─┘└─────┘┴
typ └────┘└─────┘└┘└──────┘└┘ ┴ ┴ ┴ ┴┴┴└┘┴└┘┴ ┴ ┴ └─────────┘└────────────────┘┴└──┘└─┘└─────┘┴
doc └────┘ └┘ └┘ ┴ ┴ ┴ ┴ ┴└┘┴ ┴ ┴ └─────────┘ ┴ └─┘ ┴
txt └────┘ └┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────────┘ ┴ └─┘ ┴
par └────┘ └┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────────┘ ┴ └─┘ ┴
pid └──┘ └┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────────┘ ┴ └─┘ ┴
st ─────────┘└───────────┘└────────┘└────────────────────────────────┘└──────────────────────────┘┴└───────┘└──
425 exact le_trans (nat.mul_le_mul_left _ a1) (nat.le_add_right _ _) },
id └──────┘ └─────────────────┘ └┘ └──────────────┘
src └────┘└──────┘┴ └─────────────────┘└─┘ └┘ └──────────────┘└────┘
typ └────┘└──────┘┴ └─────────────────┘└─┘└┘└┘ └──────────────┘└────┘
doc └────┘ ┴ └─┘ └┘ └────┘
txt └────┘ ┴ └─┘ └┘ └────┘
par └────┘ ┴ └─┘ └┘ └────┘
pid ┴ ┴ └─┘ └┘ └───┘┴
st ──────────────────────────────────────────────────────────────────────────┘└┘└
426 have npm : (n-1).succ = n := nat.succ_pred_eq_of_pos npos,
id ┴ └─────────────────────┘ └──┘
src └─────────┘ └──────┘ ┴ └──┘└─────────────────────┘┴
typ └─────────┘ └──────┘ ┴┴└──┘└─────────────────────┘┴└──┘
doc └─────────┘ └──────┘ ┴ └──┘ ┴
txt └─────────┘ └──────┘ ┴ └──┘ ┴
par └─────────┘ └──────┘ ┴ └──┘ ┴
pid └──────┘└─┘ └──────┘ ┴ └──┘ ┴
st ────────────────────────────────────────────────────────────────┘└─
427 have il : i ≤ n - 1 := by apply nat.le_of_succ_le_succ; rw npm; exact lin,
id ┴ ┴ └────────────────────┘ └─┘ └─┘
src └────────┘ ┴ ┴ ┴ └────┘ ┴└────┘└────────────────────┘└┘└─┘ └┘└────┘
typ └────────┘┴┴ ┴┴┴ └────┘ ┴└────┘└────────────────────┘└┘└─┘└─┘└┘└────┘└─┘
doc └────────┘ ┴ ┴ ┴ └────┘ ┴└────┘ └┘└─┘ └┘└────┘
txt └────────┘ ┴ ┴ ┴ └────┘ ┴└────┘ └┘└─┘ └┘└────┘
par └────────┘ ┴ ┴ ┴ └────┘ ┴└────┘ └┘└─┘ └┘└────┘
pid └─────┘└─┘ ┴ ┴ ┴ ┴└───┘ └─────┘ └───┘ └──────┘
st ────────────────────────────────┘└────────────────────────────────┘└─┘└─────────┘└─
428 cases lt_or_eq_of_le il with ill ile,
id └────────────┘ └┘
src └────┘└────────────┘┴ └───────────┘
typ └────┘└────────────┘┴└┘└───────────┘
doc └────┘ ┴ └───────────┘
txt └────┘ ┴ └───────────┘
par └────┘ ┴ └───────────┘
pid ┴ ┴ └───────────┘
st ───────────────────────────────────────────┘└─
429 { exact lt_of_lt_of_le (nat.add_lt_add_left (x_increasing a1 ill) _) ll },
id └────────────┘ └─────────────────┘ └──────────┘ └┘ └─┘ └┘
src └────┘└────────────┘┴ └─────────────────┘┴ └──────────┘┴ ┴ └───┘ ┴
typ └────┘└────────────┘┴ └─────────────────┘┴ └──────────┘┴└┘┴└─┘└───┘└┘┴
doc └────┘ ┴ ┴ ┴ ┴ └───┘ ┴
txt └────┘ ┴ ┴ ┴ ┴ └───┘ ┴
par └────┘ ┴ ┴ ┴ ┴ └───┘ ┴
pid ┴ ┴ ┴ ┴ ┴ └───┘ ┴
st ─────────┘└────────────────────────────────────────────────────────────────────┘└┘└
430 { rw ile,
id └─┘
src └─┘
typ └─┘└─┘
doc └─┘
txt └─┘
par └─┘
pid ┴
st ───────────────┘└─
431 apply lt_of_le_of_ne ll,
id └────────────┘ └┘
src └────┘└────────────┘┴
typ └────┘└────────────┘┴└┘
doc └────┘ ┴
txt └────┘ ┴
par └────┘ ┴
pid ┴ ┴
st ────────────────────────────────┘└─
432 rw ← two_mul,
id └─────┘
src └───┘└─────┘
typ └───┘└─────┘
doc └───┘
txt └───┘
par └───┘
pid └─┘
st ─────────────────────┘└─
433 exact λe, ntriv $
id └───┘
src └────┘ └─┘ ┴ └
typ └────┘ └─┘└───┘┴ └
doc └────┘ └─┘ ┴ └
txt └────┘ └─┘ ┴ └
par └────┘ └─┘ ┴ └
pid ┴ └─┘ ┴ └
st ────────────────────────────
434 let ⟨a2, s1⟩ := @eq_of_xn_modeq_lem2 _ a1 (n-1) (by rw[nat.sub_add_cancel npos]; exact e) in
id └┘ └─────────────────┘ └┘ ┴ └────────────────┘ └──┘ ┴
src ───────────┘ ┴ └┘ └───┘ └─────────────────┘└─┘ ┴ └─┘ ┴└─┘└────────────────┘┴ ┴└──────┘ └────
typ ───────────┘ ┴ └┘└┘└───┘ └─────────────────┘└─┘└┘┴ ┴ └─┘ ┴└─┘└────────────────┘┴└──┘┴└──────┘┴└────
doc ───────────┘ ┴ └┘ └───┘ └─┘ ┴ └─┘ ┴└─┘ ┴ ┴└──────┘ └────
txt ───────────┘ ┴ └┘ └───┘ └─┘ ┴ └─┘ ┴└─┘ ┴ ┴└──────┘ └────
par ───────────┘ ┴ └┘ └───┘ └─┘ ┴ └─┘ ┴└─┘ ┴ ┴└──────┘ └────
pid ───────────┘ ┴ └┘ └───┘ └─┘ ┴ └─┘ └──┘ ┴ └───────┘ └────
st ──────────────────────────────────────────────────────────────┘└─────────────────────────┘┴└───────┘└────
435 have n1 : n = 1, from le_antisymm (nat.le_of_sub_eq_zero s1) npos,
id └─────────┘ └───────────────────┘
src ───────────┘ └────┘ ┴ └───────┘└─────────┘┴ └───────────────────┘┴ └┘ └─
typ ───────────┘ └────┘ ┴ └───────┘└─────────┘┴ └───────────────────┘┴ └┘ └─
doc ───────────┘ └────┘ ┴ └───────┘ ┴ ┴ └┘ └─
txt ───────────┘ └────┘ ┴ └───────┘ ┴ ┴ └┘ └─
par ───────────┘ └────┘ ┴ └───────┘ ┴ ┴ └┘ └─
pid ───────────┘ └────┘ ┴ └───────┘ ┴ ┴ └┘ └─
st ───────────────────────────────────────────────────────────────────────────────
436 by rw [ile, a2, n1]; exact ⟨rfl, rfl, rfl, rfl⟩ } },
id └─┘ └┘ └┘ └─┘
src ───────────┘ ┴└──┘ └┘ └┘ ┴└──────┘ └┘ └┘ └┘└─┘└┘
typ ───────────┘ ┴└──┘└─┘└┘└┘└┘└┘┴└──────┘ └┘ └┘ └┘└─┘└┘
doc ───────────┘ ┴└──┘ └┘ └┘ ┴└──────┘ └┘ └┘ └┘ └┘
txt ───────────┘ ┴└──┘ └┘ └┘ ┴└──────┘ └┘ └┘ └┘ └┘
par ───────────┘ ┴└──┘ └┘ └┘ ┴└──────┘ └┘ └┘ └┘ └┘
pid ───────────┘ └───┘ └┘ └┘ └───────┘ └┘ └┘ └┘ └┘
st ─────────────┘└──────┘└──┘└──┘┴└───────────────────────────┘└──┘└
437 { rw [ein, nat.mod_self, add_zero],
id └─┘ └──────────┘ └──────┘
src └──┘ └┘└──────────┘└┘└──────┘┴
typ └──┘└─┘└┘└──────────┘└┘└──────┘┴
doc └──┘ └┘ └┘ ┴
txt └──┘ └┘ └┘ ┴
par └──┘ └┘ └┘ ┴
pid └┘ └┘ └┘ ┴
st ──────────────┘└────────────┘└────────┘┴└─
438 exact x_increasing _ (nat.pred_lt $ ne_of_gt npos) } })
id └──────────┘ └─────────┘ └──────┘ └──┘
src └────┘└──────────┘└─┘ └─────────┘┴ ┴└──────┘┴ └┘
typ └────┘└──────────┘└─┘ └─────────┘┴ ┴└──────┘┴└──┘└┘
doc └────┘ └─┘ ┴ ┴ ┴ └┘
txt └────┘ └─┘ ┴ ┴ ┴ └┘
par └────┘ └─┘ ┴ ┴ ┴ └┘
pid ┴ └─┘ ┴ ┴ ┴ ┴┴
st ──────────────────────────────────────────────────────────┘└──┘
439 (λ (jn : j > n),
id ┴ ┴
src ┴
typ ┴ ┴
440 have lem1 : j ≠ n → xn j % xn n < xn (j + 1) % xn n → xn i % xn n < xn (j + 1) % xn n, from λjn s,
id ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴
src ┴ └┘ ┴ └┘ ┴ └┘ ┴ ┴ └┘ └┘ ┴ └┘ ┴ └┘ ┴ ┴ └┘
typ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └┘ ┴
doc └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘
441 (lt_or_eq_of_le (nat.le_of_succ_le_succ ij)).elim
id └────────────┘ └────────────────────┘ └──┘
src └────────────┘ └────────────────────┘ └──┘
typ └────────────┘ └────────────────────┘ └──┘
442 (λh, lt_trans (eq_of_xn_modeq_lem3 h (le_of_lt j2n) jn $ λ⟨a1, n1, i0, j2⟩,
id ┴ └──────┘ └─────────────────┘ ┴ └──────┘ └┘ ┴
src └──────┘ └──────┘
typ ┴ └──────┘ └─────────────────┘ ┴ └──────┘ └┘ ┴
443 by rw [n1, j2] at j2n; exact absurd j2n dec_trivial) s)
id └┘ └┘ └────┘ └─┘ └─────────┘ ┴
src └──┘ └┘ └──────┘ └────┘└────┘┴ ┴└─────────┘
typ └──┘└┘└┘└┘└──────┘ └────┘└────┘┴└─┘┴└─────────┘ ┴
doc └──┘ └┘ └──────┘ └────┘ ┴ ┴└─────────┘
txt └──┘ └┘ └──────┘ └────┘ ┴ ┴
par └──┘ └┘ └──────┘ └────┘ ┴ ┴
pid └┘ └┘ ┴└─────┘ ┴ ┴ ┴
st └─────┘└──┘┴└───────────────────────────────────┘
444 (λh, by rw h; exact s),
id ┴ ┴ ┴
src └─┘ └────┘
typ ┴ └─┘┴ └────┘┴
doc └─┘ └────┘
txt └─┘ └────┘
par └─┘ └────┘
pid ┴ ┴
st └────────────┘
445 lem1 (ne_of_gt jn) $ int.lt_of_coe_nat_lt_coe_nat $ by {
id └──┘ └──────┘ └┘ └──────────────────────────┘
src └──────┘ └──────────────────────────┘
typ └──┘ └──────┘ └┘ └──────────────────────────┘
st └──
446 rw [lem2 j jn (le_of_lt j2n), lem2 (j+1) (nat.le_succ_of_le jn) j2n],
id └──┘ ┴ └┘ └──────┘ └─┘ └──┘ ┴ └───────────────┘ └┘ └─┘
src └──┘ ┴ ┴ ┴ └──────┘┴ └─┘ ┴ └─┘ └───────────────┘┴ └┘ ┴
typ └──┘└──┘┴┴┴└┘┴ └──────┘┴└─┘└─┘└──┘┴ ┴ └─┘ └───────────────┘┴└┘└┘└─┘┴
doc └──┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴
txt └──┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴
par └──┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴
pid └┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─┘ ┴ └┘ ┴
st ───────────────────────────────────┘└─────────────────────────────────────┘└──
447 refine sub_lt_sub_left (int.coe_nat_lt_coe_nat_of_lt $ x_increasing _ _) _,
id └─────────────┘ └──────────────────────────┘ └──────────┘
src └─────┘└─────────────┘┴ └──────────────────────────┘┴ ┴└──────────┘└─────┘
typ └─────┘└─────────────┘┴ └──────────────────────────┘┴ ┴└──────────┘└─────┘
doc └─────┘ ┴ ┴ ┴ └─────┘
txt └─────┘ ┴ ┴ ┴ └─────┘
par └─────┘ ┴ ┴ ┴ └─────┘
pid ┴ ┴ ┴ ┴ └─────┘
st ─────────────────────────────────────────────────────────────────────────────────┘└─
448 rw [nat.sub_succ],
id └──────────┘
src └──┘└──────────┘┴
typ └──┘└──────────┘┴
doc └──┘ ┴
txt └──┘ ┴
par └──┘ ┴
pid └┘ ┴
st ───────────────────────┘└──
449 exact nat.pred_lt (ne_of_gt $ nat.sub_pos_of_lt j2n) })
id └─────────┘ └──────┘ └───────────────┘ └─┘
src └────┘└─────────┘┴ └──────┘┴ ┴└───────────────┘┴ └┘
typ └────┘└─────────┘┴ └──────┘┴ ┴└───────────────┘┴└─┘└┘
doc └────┘ ┴ ┴ ┴ ┴ └┘
txt └────┘ ┴ ┴ ┴ ┴ └┘
par └────┘ ┴ ┴ ┴ ┴ └┘
pid ┴ ┴ ┴ ┴ ┴ ┴┴
st ────────────────────────────────────────────────────────────┘└┘
450
451 theorem eq_of_xn_modeq_le {i j n} (npos : n > 0) (ij : i ≤ j) (j2n : j ≤ 2 * n) (h : xn i ≡ xn j [MOD xn n])
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src ┴ ┴ ┴ ┴ └┘ ┴ └┘ └──┘ └┘ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
452 (ntriv : ¬(a = 2 ∧ n = 1 ∧ i = 0 ∧ j = 2)) : i = j :=
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
453 (lt_or_eq_of_le ij).resolve_left $ λij',
id └────────────┘ └┘ └──────────┘ └─┘
src └────────────┘ └──────────┘
typ └────────────┘ └┘ └──────────┘ └─┘
454 if jn : j = n then by {
id └┘ ┴ ┴ ┴
src └┘ ┴
typ └┘ ┴ ┴ ┴
st └──
455 refine ne_of_gt _ h,
id └──────┘ ┴
src └─────┘└──────┘└─┘
typ └─────┘└──────┘└─┘┴
doc └─────┘ └─┘
txt └─────┘ └─┘
par └─────┘ └─┘
pid ┴ └─┘
st ──────────────────────┘└─
456 rw [jn, nat.mod_self],
id └┘ └──────────┘
src └──┘ └┘└──────────┘┴
typ └──┘└┘└┘└──────────┘┴
doc └──┘ └┘ ┴
txt └──┘ └┘ ┴
par └──┘ └┘ ┴
pid └┘ └┘ ┴
st ─────────┘└────────────┘└──
457 have x0 : xn a1 0 % xn a1 n > 0 := by rw [nat.mod_eq_of_lt (x_increasing a1 npos)]; exact dec_trivial,
id ┴ └┘ └┘ ┴ ┴ └──────────────┘ └──────────┘ └┘ └──┘ └─────────┘
src └────────┘ ┴ └─┘┴┴└┘┴ ┴ ┴┴└────┘ ┴└──┘└──────────────┘┴ └──────────┘┴ ┴ └┘└┘└────┘└─────────┘
typ └────────┘ ┴ └─┘┴┴└┘┴└┘┴┴┴┴└────┘ ┴└──┘└──────────────┘┴ └──────────┘┴└┘┴└──┘└┘└┘└────┘└─────────┘
doc └────────┘ ┴ └─┘ ┴└┘┴ ┴ ┴ └────┘ ┴└──┘ ┴ ┴ ┴ └┘└┘└────┘└─────────┘
txt └────────┘ ┴ └─┘ ┴ ┴ ┴ ┴ └────┘ ┴└──┘ ┴ ┴ ┴ └┘└┘└────┘
par └────────┘ ┴ └─┘ ┴ ┴ ┴ ┴ └────┘ ┴└──┘ ┴ ┴ ┴ └┘└┘└────┘
pid └─────┘└─┘ ┴ └─┘ ┴ ┴ ┴ ┴ ┴└───┘ └───┘ ┴ ┴ ┴ └────────┘
st ────────────────────────────────────────┘└──────────────────────────────────────────┘┴└─────────────────┘└─
458 cases i with i, exact x0,
id ┴ └┘
src └────┘ └─────┘ └────┘
typ └────┘┴└─────┘ └────┘└┘
doc └────┘ └─────┘ └────┘
txt └────┘ └─────┘ └────┘
par └────┘ └─────┘ └────┘
pid ┴ └─────┘ ┴
st ─────────────────┘└────────┘└─
459 rw jn at ij',
id └┘
src └─┘ └─────┘
typ └─┘└┘└─────┘
doc └─┘ └─────┘
txt └─┘ └─────┘
par └─┘ └─────┘
pid ┴ └─────┘
st ───────────────┘└─
460 exact lt_trans x0 (eq_of_xn_modeq_lem3 _ npos (nat.succ_pos _) (le_trans ij j2n) (ne_of_lt ij') $
id └──────┘ └┘ └─────────────────┘ └──┘ └──────────┘ └──────┘ └┘ └─┘ └──────┘ └─┘
src └────┘└──────┘┴ ┴ └─────────────────┘└─┘ ┴ └──────────┘└──┘ └──────┘┴ ┴ └┘ └──────┘┴ └┘ └
typ └────┘└──────┘┴└┘┴ └─────────────────┘└─┘└──┘┴ └──────────┘└──┘ └──────┘┴└┘┴└─┘└┘ └──────┘┴└─┘└┘ └
doc └────┘ ┴ ┴ └─┘ ┴ └──┘ ┴ ┴ └┘ ┴ └┘ └
txt └────┘ ┴ ┴ └─┘ ┴ └──┘ ┴ ┴ └┘ ┴ └┘ └
par └────┘ ┴ ┴ └─┘ ┴ └──┘ ┴ ┴ └┘ ┴ └┘ └
pid ┴ ┴ ┴ └─┘ ┴ └──┘ ┴ ┴ └┘ ┴ └┘ └
st ──────────────────────────────────────────────────────────────────────────────────────────────────────
461 λ⟨a1, n1, _, i2⟩, by rw [n1, i2] at ij'; exact absurd ij' dec_trivial)
id └┘ └┘ └────┘ └─┘
src ─────┘ ┴ └┘ └───┘ └─┘ ┴└──┘ └┘ └──────┘└──────┘└────┘┴ ┴ └─
typ ─────┘ ┴ └┘ └───┘ └─┘ ┴└──┘└┘└┘└┘└──────┘└──────┘└────┘┴└─┘┴ └─
doc ─────┘ ┴ └┘ └───┘ └─┘ ┴└──┘ └┘ └──────┘└──────┘ ┴ ┴ └─
txt ─────┘ ┴ └┘ └───┘ └─┘ ┴└──┘ └┘ └──────┘└──────┘ ┴ ┴ └─
par ─────┘ ┴ └┘ └───┘ └─┘ ┴└──┘ └┘ └──────┘└──────┘ ┴ ┴ └─
pid ─────┘ ┴ └┘ └───┘ └─┘ └───┘ └┘ └──────────────┘ ┴ ┴ ┴└
st ─────────────────────────┘└─────┘└──┘┴└───────────────────────────────────┘└─
462 } else ne_of_lt (eq_of_xn_modeq_lem3 npos ij' j2n jn ntriv) h
id └──────┘ └─────────────────┘ └──┘ └─┘ └─┘ └┘ └───┘ ┴
src ─┘ └──────┘ └─────────────────┘
typ ─┘ └──────┘ └─────────────────┘ └──┘ └─┘ └─┘ └┘ └───┘ ┴
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘└┘
463
464 theorem eq_of_xn_modeq {i j n} (npos : n > 0) (i2n : i ≤ 2 * n) (j2n : j ≤ 2 * n) (h : xn i ≡ xn j [MOD xn n])
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src ┴ ┴ ┴ ┴ ┴ └┘ ┴ └┘ └──┘ └┘ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
465 (ntriv : a = 2 → n = 1 → (i = 0 → j ≠ 2) ∧ (i = 2 → j ≠ 0)) : i = j :=
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
466 (le_total i j).elim
id └──────┘ ┴ ┴ └──┘
src └──────┘ └──┘
typ └──────┘ ┴ ┴ └──┘
467 (λij, eq_of_xn_modeq_le npos ij j2n h $ λ⟨a2, n1, i0, j2⟩, (ntriv a2 n1).left i0 j2)
id └┘ └───────────────┘ └──┘ └┘ └─┘ ┴ ┴└┘ └┘ └┘ └┘ └───┘ └──┘
src └───────────────┘ └──┘
typ └┘ └───────────────┘ └──┘ └┘ └─┘ ┴ ┴└┘ └┘ └┘ └┘ └───┘ └──┘
468 (λij, (eq_of_xn_modeq_le npos ij i2n h.symm $ λ⟨a2, n1, j0, i2⟩, (ntriv a2 n1).right i2 j0).symm)
id └┘ └───────────────┘ └──┘ └┘ └─┘ ┴└───┘ ┴└┘ └┘ └┘ └┘ └───┘ └───┘ └──┘
src └───────────────┘ └───┘ └───┘ └──┘
typ └┘ └───────────────┘ └──┘ └┘ └─┘ ┴└───┘ ┴└┘ └┘ └┘ └┘ └───┘ └───┘ └──┘
469
470 theorem eq_of_xn_modeq' {i j n} (ipos : i > 0) (hin : i ≤ n) (j4n : j ≤ 4 * n) (h : xn j ≡ xn i [MOD xn n]) :
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src ┴ ┴ ┴ ┴ └┘ ┴ └┘ └──┘ └┘ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
471 j = i ∨ j + i = 4 * n :=
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
472 have i2n : i ≤ 2*n, by apply le_trans hin; rw two_mul; apply nat.le_add_left,
id ┴ ┴ ┴┴ └──────┘ └─┘ └─────┘ └─────────────┘
src ┴ ┴ └────┘└──────┘┴ └─┘└─────┘ └────┘└─────────────┘
typ ┴ ┴ ┴┴ └────┘└──────┘┴└─┘ └─┘└─────┘ └────┘└─────────────┘
doc └────┘ ┴ └─┘ └────┘
txt └────┘ ┴ └─┘ └────┘
par └────┘ ┴ └─┘ └────┘
pid ┴ ┴ ┴ ┴
st └──────────────────────┘└─────┘└─────────────────────┘
473 have npos : n > 0, from lt_of_lt_of_le ipos hin,
id ┴ ┴ └────────────┘ └──┘ └─┘
src ┴ └────────────┘
typ ┴ ┴ └────────────┘ └──┘ └─┘
474 (le_or_gt j (2 * n)).imp
id └──────┘ ┴ ┴ ┴ └─┘
src └──────┘ ┴ └─┘
typ └──────┘ ┴ ┴ ┴ └─┘
475 (λj2n : j ≤ 2*n, eq_of_xn_modeq npos j2n i2n h $
id ┴ ┴ ┴┴ └────────────┘ └──┘ └─┘ └─┘ ┴
src ┴ ┴ └────────────┘
typ ┴ ┴ ┴┴ └────────────┘ └──┘ └─┘ └─┘ ┴
476 λa2 n1, ⟨λj0 i2, by rw [n1, i2] at hin; exact absurd hin dec_trivial,
id └┘ └┘ └┘ └┘ └┘ └┘ └────┘ └─┘ └─────────┘
src └──┘ └┘ └──────┘ └────┘└────┘┴ ┴└─────────┘
typ └┘ └┘ └┘ └┘ └──┘└┘└┘└┘└──────┘ └────┘└────┘┴└─┘┴└─────────┘
doc └──┘ └┘ └──────┘ └────┘ ┴ ┴└─────────┘
txt └──┘ └┘ └──────┘ └────┘ ┴ ┴
par └──┘ └┘ └──────┘ └────┘ ┴ ┴
pid └┘ └┘ ┴└─────┘ ┴ ┴ ┴
st └─────┘└──┘┴└───────────────────────────────────┘
477 λj2 i0, ne_of_gt ipos i0⟩)
id └┘ └┘ └──────┘ └──┘ └┘
src └──────┘
typ └┘ └┘ └──────┘ └──┘ └┘
478 (λj2n : j > 2*n, suffices i = 4*n - j, by rw [this, nat.add_sub_of_le j4n],
id ┴ ┴ ┴┴ ┴ ┴ ┴┴ ┴ ┴ └──┘ └───────────────┘ └─┘
src ┴ ┴ ┴ ┴ ┴ └──┘ └┘└───────────────┘┴ ┴
typ ┴ ┴ ┴┴ ┴ ┴ ┴┴ ┴ ┴ └──┘└──┘└┘└───────────────┘┴└─┘┴
doc └──┘ └┘ ┴ ┴
txt └──┘ └┘ ┴ ┴
par └──┘ └┘ ┴ ┴
pid └┘ └┘ ┴ ┴
st └───────┘└─────────────────────┘┴
479 have j42n : 4*n - j ≤ 2*n, from @nat.le_of_add_le_add_right j _ _ $
id ┴┴ ┴ ┴ ┴ ┴┴ └────────────────────────┘ ┴
src ┴ ┴ ┴ ┴ └────────────────────────┘
typ ┴┴ ┴ ┴ ┴ ┴┴ └────────────────────────┘ ┴
480 by rw [nat.sub_add_cancel j4n, show 4*n = 2*n + 2*n, from right_distrib 2 2 n];
id └────────────────┘ └─┘ ┴ ┴ ┴ └───────────┘ ┴
src └──┘└────────────────┘┴ └┘ └┘┴ ┴┴└┘ ┴┴└┘ └─────┘└───────────┘└───┘ ┴
typ └──┘└────────────────┘┴└─┘└┘ └┘┴ ┴┴└┘ ┴┴└┘ └─────┘└───────────┘└───┘┴┴
doc └──┘ ┴ └┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ ┴
txt └──┘ ┴ └┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ ┴
par └──┘ ┴ └┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ ┴
pid └┘ ┴ └┘ └┘ ┴ └┘ ┴ └┘ └─────┘ └───┘ ┴
st └─────────────────────────┘└──────────────────────────────────────────────┘┴└─
481 exact nat.add_le_add_left (le_of_lt j2n) _,
id └─────────────────┘ └──────┘ └─┘
src └────┘└─────────────────┘┴ └──────┘┴ └─┘
typ └────┘└─────────────────┘┴ └──────┘┴└─┘└─┘
doc └────┘ ┴ ┴ └─┘
txt └────┘ ┴ ┴ └─┘
par └────┘ ┴ ┴ └─┘
pid ┴ ┴ ┴ └─┘
st ─────────────────────────────────────────────────┘
482 eq_of_xn_modeq npos i2n j42n
id └────────────┘ └──┘ └─┘ └──┘
src └────────────┘
typ └────────────┘ └──┘ └─┘ └──┘
483 (h.symm.trans $ let t := xn_modeq_x4n_sub j42n in by rwa [nat.sub_sub_self j4n] at t)
id ┴└───┘└────┘ ┴ └──────────────┘ └──┘ └──────────────┘ └─┘
src └───┘└────┘ └──────────────┘ └───┘└──────────────┘┴ └────┘
typ ┴└───┘└────┘ ┴ └──────────────┘ └──┘ └───┘└──────────────┘┴└─┘└────┘
doc └───┘ ┴ └────┘
txt └───┘ ┴ └────┘
par └───┘ ┴ └────┘
pid └┘ ┴ ┴└───┘
st └────────────────────────┘┴└───┘
484 (λa2 n1, ⟨λi0, absurd i0 (ne_of_gt ipos), λi2, by rw[n1, i2] at hin; exact absurd hin dec_trivial⟩))
id └┘ └┘ └┘ └────┘ └┘ └──────┘ └──┘ └┘ └┘ └┘ └────┘ └─┘
src └────┘ └──────┘ └─┘ └┘ └──────┘ └────┘└────┘┴ ┴
typ └┘ └┘ └┘ └────┘ └┘ └──────┘ └──┘ └┘ └─┘└┘└┘└┘└──────┘ └────┘└────┘┴└─┘┴
doc └─┘ └┘ └──────┘ └────┘ ┴ ┴
txt └─┘ └┘ └──────┘ └────┘ ┴ ┴
par └─┘ └┘ └──────┘ └────┘ ┴ ┴
pid ┴ └┘ ┴└─────┘ ┴ ┴ ┴
st └────┘└──┘┴└───────────────────────────────────┘
485
486 theorem modeq_of_xn_modeq {i j n} (ipos : i > 0) (hin : i ≤ n) (h : xn j ≡ xn i [MOD xn n]) :
id ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src ┴ ┴ └┘ ┴ └┘ └──┘ └┘ ┴
typ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
487 j ≡ i [MOD 4 * n] ∨ j + i ≡ 0 [MOD 4 * n] :=
id ┴ ┴ ┴ └──┘ ┴ ┴┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴┴
src ┴ └──┘ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴
typ ┴ ┴ ┴ └──┘ ┴ ┴┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴┴
doc ┴ └──┘ ┴ ┴ └──┘ ┴
488 let j' := j % (4 * n) in
id └┘ ┴ ┴ ┴ ┴
src ┴ ┴
typ └┘ ┴ ┴ ┴ ┴
489 have n4 : 4 * n > 0, from mul_pos dec_trivial (lt_of_lt_of_le ipos hin),
id ┴ ┴ ┴ └─────┘ └─────────┘ └────────────┘ └──┘ └─┘
src ┴ ┴ └─────┘ └─────────┘ └────────────┘
typ ┴ ┴ ┴ └─────┘ └─────────┘ └────────────┘ └──┘ └─┘
doc └─────────┘
490 have jl : j' < 4 * n, from nat.mod_lt _ n4,
id └┘ ┴ ┴ ┴ └────────┘ └┘
src ┴ ┴ └────────┘
typ └┘ ┴ ┴ ┴ └────────┘ └┘
491 have jj : j ≡ j' [MOD 4 * n], by delta modeq; rw nat.mod_eq_of_lt jl,
id ┴ ┴ └┘ └──┘ ┴ ┴┴ └──────────────┘ └┘
src ┴ └──┘ ┴ ┴ └─────────┘ └─┘└──────────────┘┴
typ ┴ ┴ └┘ └──┘ ┴ ┴┴ └─────────┘ └─┘└──────────────┘┴└┘
doc ┴ └──┘ ┴ └─────────┘ └─┘ ┴
txt └─────────┘ └─┘ ┴
par └─────────┘ └─┘ ┴
pid └────┘ ┴ ┴
st └───────────────┘└──────────────┘└─┘
492 have ∀j q, xn (j + 4 * n * q) ≡ xn j [MOD xn n], begin
id ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
src └┘ ┴ ┴ ┴ ┴ └┘ └──┘ └┘ ┴
typ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ └──┘ └┘ ┴┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
st └─────
493 intros j q, induction q with q IH, { simp },
id ┴
src └────────┘ └────────┘ └────────┘ └───┘
typ └────────┘ └────────┘┴└────────┘ └───┘
doc └────────┘ └────────┘ └────────┘ └───┘
txt └────────┘ └────────┘ └────────┘ └───┘
par └────────┘ └────────┘ └────────┘ └───┘
pid └──┘ ┴ ┴└───────┘ ┴
st ─────────────┘└─────────────────────┘└──┘└───┘└┘└
494 rw[nat.mul_succ, ← add_assoc, add_comm],
id └──────────┘ └───────┘ └──────┘
src └─┘└──────────┘└──┘└───────┘└┘└──────┘┴
typ └─┘└──────────┘└──┘└───────┘└┘└──────┘┴
doc └─┘ └──┘ └┘ ┴
txt └─┘ └──┘ └┘ ┴
par └─┘ └──┘ └┘ ┴
pid ┴ └──┘ └┘ ┴
st ──────────────────┘└───────────┘└────────┘┴└─
495 exact modeq.trans (xn_modeq_x4n_add _ _ _) IH
id └─────────┘ └──────────────┘ └┘
src └────┘└─────────┘┴ └──────────────┘└──────┘ └
typ └────┘└─────────┘┴ └──────────────┘└──────┘└┘└
doc └────┘ ┴ └──────┘ └
txt └────┘ ┴ └──────┘ └
par └────┘ ┴ └──────┘ └
pid ┴ ┴ └──────┘ └
st ──────────────────────────────────────────────────
496 end,
src ─┘
typ ─┘
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘└─┘
497 or.imp
id └────┘
src └────┘
typ └────┘
498 (λ(ji : j' = i), by rwa ← ji)
id └┘ ┴ ┴ └┘
src ┴ └────┘
typ └┘ ┴ ┴ └────┘└┘
doc └────┘
txt └────┘
par └────┘
pid └─┘
st └───────┘
499 (λ(ji : j' + i = 4 * n), (modeq.modeq_add jj (modeq.refl _)).trans $
id └┘ ┴ ┴ ┴ ┴ ┴ └─────────────┘ └┘ └────────┘ └───┘
src ┴ ┴ ┴ └─────────────┘ └────────┘ └───┘
typ └┘ ┴ ┴ ┴ ┴ ┴ └─────────────┘ └┘ └────────┘ └───┘
500 by rw ji; exact modeq.modeq_zero_iff.2 (dvd_refl _))
id └┘ └──────────────────┘ └──────┘
src └─┘ └────┘└──────────────────┘└─┘ └──────┘└─┘
typ └─┘└┘ └────┘└──────────────────┘└─┘ └──────┘└─┘
doc └─┘ └────┘ └─┘ └─┘
txt └─┘ └────┘ └─┘ └─┘
par └─┘ └────┘ └─┘ └─┘
pid ┴ ┴ └─┘ └─┘
st └───────────────────────────────────────────────┘
501 (eq_of_xn_modeq' ipos hin (le_of_lt jl) $
id └─────────────┘ └──┘ └─┘ └──────┘ └┘
src └─────────────┘ └──────┘
typ └─────────────┘ └──┘ └─┘ └──────┘ └┘
502 (modeq.symm (by rw ← nat.mod_add_div j (4*n); exact this j' _)).trans h)
id └────────┘ └─────────────┘ ┴ ┴┴ └──┘ └┘ └───┘ ┴
src └────────┘ └───┘└─────────────┘┴ ┴ ┴┴ ┴ └────┘ ┴ └┘ └───┘
typ └────────┘ └───┘└─────────────┘┴┴┴ ┴┴┴┴ └────┘└──┘┴└┘└┘ └───┘ ┴
doc └───┘ ┴ ┴ ┴ ┴ └────┘ ┴ └┘
txt └───┘ ┴ ┴ ┴ ┴ └────┘ ┴ └┘
par └───┘ ┴ ┴ ┴ ┴ └────┘ ┴ └┘
pid └─┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘
st └────────────────────────────────────────────┘
503 end
504
505 theorem xy_modeq_of_modeq {a b c} (a1 : a > 1) (b1 : b > 1) (h : a ≡ b [MOD c]) :
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴┴
src ┴ ┴ ┴ └──┘ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴┴
doc ┴ └──┘ ┴
506 ∀ n, xn a1 n ≡ xn b1 n [MOD c] ∧ yn a1 n ≡ yn b1 n [MOD c]
id ┴ └┘ └┘ ┴ ┴ └┘ └┘ ┴ └──┘ ┴┴ ┴ └┘ └┘ ┴ ┴ └┘ └┘ ┴ └──┘ ┴┴
src └┘ ┴ └┘ └──┘ ┴ ┴ └┘ ┴ └┘ └──┘ ┴
typ ┴ └┘ └┘ ┴ ┴ └┘ └┘ ┴ └──┘ ┴┴ ┴ └┘ └┘ ┴ ┴ └┘ └┘ ┴ └──┘ ┴┴
doc └┘ ┴ └┘ └──┘ ┴ └┘ ┴ └┘ └──┘ ┴
507 | 0 := by constructor; refl
src └─────────┘ └───┘
typ └─────────┘ └───┘
doc └─────────┘ └───┘
txt └─────────┘ └───┘
par └─────────┘ └───┘
pid ┴
st └─────────────────┘
508 | 1 := by simp; exact ⟨h, modeq.refl 1⟩
id ┴ └────────┘
src └──┘ └────┘ └┘└────────┘└──┘
typ └──┘ └────┘ ┴└┘└────────┘└──┘
doc └──┘ └────┘ └┘ └──┘
txt └──┘ └────┘ └┘ └──┘
par └──┘ └────┘ └┘ └──┘
pid ┴ └┘ └─┘┴
st └─────────────────────────────┘
509 | (n+2) := ⟨
id ┴┴
src ┴
typ ┴┴
510 modeq.modeq_add_cancel_right (xy_modeq_of_modeq n).left $
id └──────────────────────────┘ └───────────────┘ └──┘
src └──────────────────────────┘ └──┘
typ └──────────────────────────┘ └───────────────┘ └──┘
511 by rw [xn_succ_succ a1, xn_succ_succ b1]; exact
id └──────────┘ └┘ └──────────┘ └┘
src └──┘└──────────┘┴ └┘└──────────┘┴ ┴ └─────
typ └──┘└──────────┘┴└┘└┘└──────────┘┴└┘┴ └─────
doc └──┘ ┴ └┘ ┴ ┴ └─────
txt └──┘ ┴ └┘ ┴ ┴ └─────
par └──┘ ┴ └┘ ┴ ┴ └─────
pid └┘ ┴ └┘ ┴ ┴ └
st └──────────────────┘└───────────────┘┴└───────
512 modeq.modeq_mul (modeq.modeq_mul_left _ h) (xy_modeq_of_modeq (n+1)).left,
id └─────────────┘ └──────────────────┘ ┴ └───────────────┘ ┴┴
src ───┘└─────────────┘┴ └──────────────────┘└─┘ └┘ ┴ ┴└──────┘
typ ───┘└─────────────┘┴ └──────────────────┘└─┘┴└┘ └───────────────┘┴ ┴┴└──────┘
doc ───┘ ┴ └─┘ └┘ ┴ └──────┘
txt ───┘ ┴ └─┘ └┘ ┴ └──────┘
par ───┘ ┴ └─┘ └┘ ┴ └──────┘
pid ───┘ ┴ └─┘ └┘ ┴ └─────┘┴
st ────────────────────────────────────────────────────────────────────────────┘
513 modeq.modeq_add_cancel_right (xy_modeq_of_modeq n).right $
id └──────────────────────────┘ └───────────────┘ └───┘
src └──────────────────────────┘ └───┘
typ └──────────────────────────┘ └───────────────┘ └───┘
514 by rw [yn_succ_succ a1, yn_succ_succ b1]; exact
id └──────────┘ └┘ └──────────┘ └┘
src └──┘└──────────┘┴ └┘└──────────┘┴ ┴ └─────
typ └──┘└──────────┘┴└┘└┘└──────────┘┴└┘┴ └─────
doc └──┘ ┴ └┘ ┴ ┴ └─────
txt └──┘ ┴ └┘ ┴ ┴ └─────
par └──┘ ┴ └┘ ┴ ┴ └─────
pid └┘ ┴ └┘ ┴ ┴ └
st └──────────────────┘└───────────────┘┴└───────
515 modeq.modeq_mul (modeq.modeq_mul_left _ h) (xy_modeq_of_modeq (n+1)).right⟩
id └─────────────┘ └──────────────────┘ ┴ └───────────────┘ ┴
src ───┘└─────────────┘┴ └──────────────────┘└─┘ └┘ ┴ └───────┘
typ ───┘└─────────────┘┴ └──────────────────┘└─┘┴└┘ └───────────────┘┴ ┴ └───────┘
doc ───┘ ┴ └─┘ └┘ ┴ └───────┘
txt ───┘ ┴ └─┘ └┘ ┴ └───────┘
par ───┘ ┴ └─┘ └┘ ┴ └───────┘
pid ───┘ ┴ └─┘ └┘ ┴ └──────┘┴
st ─────────────────────────────────────────────────────────────────────────────┘
516
517 theorem matiyasevic {a k x y} : (∃ a1 : a > 1, xn a1 k = x ∧ yn a1 k = y) ↔
id ┴ ┴ ┴ ┴ └┘ └┘ ┴ ┴ ┴ ┴ └┘ └┘ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ └┘ ┴ ┴ └┘ ┴ ┴
typ ┴ ┴ ┴ ┴ └┘ └┘ ┴ ┴ ┴ ┴ └┘ └┘ ┴ ┴ ┴ ┴
doc └┘ └┘
518 a > 1 ∧ k ≤ y ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴
519 (x = 1 ∧ y = 0 ∨
id ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴
520 ∃ (u v s t b : ℕ),
id ┴ ┴ ┴
src ┴ ┴ ┴
typ ┴ ┴ ┴
521 x * x - (a * a - 1) * y * y = 1 ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
522 u * u - (a * a - 1) * v * v = 1 ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
523 s * s - (b * b - 1) * t * t = 1 ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
524 b > 1 ∧ b ≡ 1 [MOD 4 * y] ∧ b ≡ a [MOD u] ∧
id ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴┴ ┴ ┴ ┴ ┴ └──┘ ┴┴ ┴
src ┴ ┴ ┴ └──┘ ┴ ┴ ┴ ┴ └──┘ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴┴ ┴ ┴ ┴ ┴ └──┘ ┴┴ ┴
doc ┴ └──┘ ┴ ┴ └──┘ ┴
525 v > 0 ∧ y * y ∣ v ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
526 s ≡ x [MOD u] ∧
id ┴ ┴ ┴ └──┘ ┴┴ ┴
src ┴ └──┘ ┴ ┴
typ ┴ ┴ ┴ └──┘ ┴┴ ┴
doc ┴ └──┘ ┴
527 t ≡ k [MOD 4 * y]) :=
id ┴ ┴ ┴ └──┘ ┴ ┴┴
src ┴ └──┘ ┴ ┴
typ ┴ ┴ ┴ └──┘ ┴ ┴┴
doc ┴ └──┘ ┴
528 ⟨λ⟨a1, hx, hy⟩, by rw [← hx, ← hy];
id ┴ └┘ └┘
src └────┘ └──┘ ┴
typ ┴ └────┘└┘└──┘└┘┴
doc └────┘ └──┘ ┴
txt └────┘ └──┘ ┴
par └────┘ └──┘ ┴
pid └──┘ └──┘ ┴
st └───────┘└────┘┴└─
529 refine ⟨a1, (nat.eq_zero_or_pos k).elim
id └┘ └────────────────┘ ┴
src └─────┘ └┘ └────────────────┘┴ └──────
typ └─────┘ └┘└┘ └────────────────┘┴┴└──────
doc └─────┘ └┘ ┴ └──────
txt └─────┘ └┘ ┴ └──────
par └─────┘ └┘ ┴ └──────
pid ┴ └┘ ┴ └──────
st ──────────────────────────────────────────
530 (λk0, by rw k0; exact ⟨le_refl _, or.inl ⟨rfl, rfl⟩⟩) (λkpos, _)⟩; exact
id └┘ └─────┘ └────┘ └─┘
src ───┘ └──┘ ┴└─┘ └┘└────┘ └─────┘└──┘└────┘┴ └┘└─┘└┘└┘ └───────┘ └─────
typ ───┘ └──┘ ┴└─┘└┘└──────┘ └─────┘└──┘└────┘┴ └┘└─┘└──┘ └───────┘ └─────
doc ───┘ └──┘ ┴└─┘ └┘└────┘ └──┘ ┴ └┘ └┘└┘ └───────┘ └─────
txt ───┘ └──┘ ┴└─┘ └┘└────┘ └──┘ ┴ └┘ └┘└┘ └───────┘ └─────
par ───┘ └──┘ ┴└─┘ └──────┘ └──┘ ┴ └┘ └──┘ └───────┘ └─────
pid ───┘ └──┘ └──┘ └──────┘ └──┘ ┴ └┘ └──┘ └───────┘ └
st ───────────┘└──────────────────────────────────────────┘└────────────────────
531 let x := xn a1 k, y := yn a1 k,
src ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
typ ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
doc ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
st ──────────────────────────────────
532 m := 2 * (k * y),
id ┴
src ────────────┘┴┴ ┴ ┴ └──
typ ────────────┘┴┴ ┴ ┴ └──
doc ────────────┘ ┴ ┴ ┴ └──
txt ────────────┘ ┴ ┴ ┴ └──
par ────────────┘ ┴ ┴ ┴ └──
pid ────────────┘ ┴ ┴ ┴ └──
st ────────────────────────
533 u := xn a1 m, v := yn a1 m in
src ──────────┘ ┴ ┴ └─────┘ ┴ ┴ └───
typ ──────────┘ ┴ ┴ └─────┘ ┴ ┴ └───
doc ──────────┘ ┴ ┴ └─────┘ ┴ ┴ └───
txt ──────────┘ ┴ ┴ └─────┘ ┴ ┴ └───
par ──────────┘ ┴ ┴ └─────┘ ┴ ┴ └───
pid ──────────┘ ┴ ┴ └─────┘ ┴ ┴ └───
st ────────────────────────────────────
534 have ky : k ≤ y, from yn_ge_n a1 k,
id ┴ └─────┘ └┘ ┴
src ─┘ └────┘ ┴┴┴ └─────┘└─────┘┴ ┴ └─
typ ─┘ └────┘ ┴┴┴ └─────┘└─────┘┴└┘┴┴└─
doc ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └─
st ──────────────────────────────────────
535 have yv : y * y ∣ v, from dvd_trans (ysq_dvd_yy a1 k) $
id ┴ └───────┘ └────────┘
src ─┘ └────┘ ┴ ┴ ┴┴┴ └─────┘└───────┘┴ └────────┘┴ ┴ └┘ └
typ ─┘ └────┘ ┴ ┴ ┴┴┴ └─────┘└───────┘┴ └────────┘┴ ┴ └┘ └
doc ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ └┘ └
txt ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ └┘ └
par ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ └┘ └
pid ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ └┘ └
st ──────────────────────────────────────────────────────────
536 (y_dvd_iff _ _ _).2 $ dvd_mul_left _ _,
id └───────┘ └──────────┘
src ─────┘ └───────┘└────────┘ ┴└──────────┘└─────
typ ─────┘ └───────┘└────────┘ ┴└──────────┘└─────
doc ─────┘ └────────┘ ┴ └─────
txt ─────┘ └────────┘ ┴ └─────
par ─────┘ └────────┘ ┴ └─────
pid ─────┘ └────────┘ ┴ └─────
st ──────────────────────────────────────────────
537 have uco : nat.coprime u (4 * y), from
src ─┘ └─────┘ ┴ ┴ └┘ ┴ └───────
typ ─┘ └─────┘ ┴ ┴ └┘ ┴ └───────
doc ─┘ └─────┘ ┴ ┴ └┘ ┴ └───────
txt ─┘ └─────┘ ┴ ┴ └┘ ┴ └───────
par ─┘ └─────┘ ┴ ┴ └┘ ┴ └───────
pid ─┘ └─────┘ ┴ ┴ └┘ ┴ └───────
st ─────────────────────────────────────────
538 have 2 ∣ v, from modeq.modeq_zero_iff.1 $ (yn_modeq_two _ _).trans $
id └──────────┘
src ───┘ └─┘ ┴ └─────┘ └─┘ ┴ └──────────┘└──────────┘ └
typ ───┘ └─┘ ┴ └─────┘ └─┘ ┴ └──────────┘└──────────┘ └
doc ───┘ └─┘ ┴ └─────┘ └─┘ ┴ └──────────┘ └
txt ───┘ └─┘ ┴ └─────┘ └─┘ ┴ └──────────┘ └
par ───┘ └─┘ ┴ └─────┘ └─┘ ┴ └──────────┘ └
pid ───┘ └─┘ ┴ └─────┘ └─┘ ┴ └──────────┘ └
st ─────────────────────────────────────────────────────────────────────────
539 modeq.modeq_zero_iff.2 (dvd_mul_right _ _),
id └──────────────────┘ └───────────┘
src ─────┘└──────────────────┘└─┘ └───────────┘└──────
typ ─────┘└──────────────────┘└─┘ └───────────┘└──────
doc ─────┘ └─┘ └──────
txt ─────┘ └─┘ └──────
par ─────┘ └─┘ └──────
pid ─────┘ └─┘ └──────
st ──────────────────────────────────────────────────
540 have nat.coprime u 2, from
src ───┘ └───────────┘ └────────
typ ───┘ └───────────┘ └────────
doc ───┘ └───────────┘ └────────
txt ───┘ └───────────┘ └────────
par ───┘ └───────────┘ └────────
pid ───┘ └───────────┘ └────────
st ───────────────────────────────
541 (xy_coprime a1 m).coprime_dvd_right this,
id └────────┘
src ─────┘ └────────┘┴ ┴ └──────────────────┘ └─
typ ─────┘ └────────┘┴ ┴ └──────────────────┘ └─
doc ─────┘ ┴ ┴ └──────────────────┘ └─
txt ─────┘ ┴ ┴ └──────────────────┘ └─
par ─────┘ ┴ ┴ └──────────────────┘ └─
pid ─────┘ ┴ ┴ └──────────────────┘ └─
st ────────────────────────────────────────────────
542 (this.mul_right this).mul_right $
id └────────┘
src ───┘ └────────┘┴ └──────────┘ └
typ ───┘ └────────┘┴ └──────────┘ └
doc ───┘ ┴ └──────────┘ └
txt ───┘ ┴ └──────────┘ └
par ───┘ ┴ └──────────┘ └
pid ───┘ ┴ └──────────┘ └
st ──────────────────────────────────────
543 (xy_coprime _ _).coprime_dvd_right (dvd_of_mul_left_dvd yv),
id └─────────────────┘
src ─────┘ └──────────────────────┘ └─────────────────┘┴ └──
typ ─────┘ └──────────────────────┘ └─────────────────┘┴ └──
doc ─────┘ └──────────────────────┘ ┴ └──
txt ─────┘ └──────────────────────┘ ┴ └──
par ─────┘ └──────────────────────┘ ┴ └──
pid ─────┘ └──────────────────────┘ ┴ └──
st ───────────────────────────────────────────────────────────────────
544 let ⟨b, ba, bm1⟩ := modeq.chinese_remainder uco a 1 in
id ┴ └┘ └─┘ └─────────────────────┘ ┴
src ─┘ ┴ └┘ └┘ └───┘└─────────────────────┘┴ ┴ └─────
typ ─┘ ┴ ┴└┘└┘└┘└─┘└───┘└─────────────────────┘┴ ┴┴└─────
doc ─┘ ┴ └┘ └┘ └───┘ ┴ ┴ └─────
txt ─┘ ┴ └┘ └┘ └───┘ ┴ ┴ └─────
par ─┘ ┴ └┘ └┘ └───┘ ┴ ┴ └─────
pid ─┘ ┴ └┘ └┘ └───┘ ┴ ┴ └─────
st ─────────────────────────────────────────────────────────
545 have m1 : 1 < m, from
id ┴
src ─┘ └──────┘┴┴ └──────
typ ─┘ └──────┘┴┴ └──────
doc ─┘ └──────┘ ┴ └──────
txt ─┘ └──────┘ ┴ └──────
par ─┘ └──────┘ ┴ └──────
pid ─┘ └──────┘ ┴ └──────
st ────────────────────────
546 have 0 < k * y, from mul_pos kpos (y_increasing a1 kpos),
id └─────┘ └──────────┘ └──┘
src ───┘ └─┘ ┴ ┴ ┴ └─────┘└─────┘┴ ┴ └──────────┘┴ ┴ └──
typ ───┘ └─┘ ┴ ┴ ┴ └─────┘└─────┘┴ ┴ └──────────┘┴ ┴└──┘└──
doc ───┘ └─┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └──
txt ───┘ └─┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └──
par ───┘ └─┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └──
pid ───┘ └─┘ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └──
st ──────────────────────────────────────────────────────────────
547 nat.mul_le_mul_left 2 this,
id └─────────────────┘
src ───┘└─────────────────┘└─┘ └─
typ ───┘└─────────────────┘└─┘ └─
doc ───┘ └─┘ └─
txt ───┘ └─┘ └─
par ───┘ └─┘ └─
pid ───┘ └─┘ └─
st ────────────────────────────────
548 have vp : v > 0, from y_increasing a1 (lt_trans zero_lt_one m1),
id ┴ └──────┘ └─────────┘
src ─┘ └────┘ ┴┴└───────┘ ┴ ┴ └──────┘┴└─────────┘┴ └──
typ ─┘ └────┘ ┴┴└───────┘ ┴ ┴ └──────┘┴└─────────┘┴ └──
doc ─┘ └────┘ ┴ └───────┘ ┴ ┴ ┴ ┴ └──
txt ─┘ └────┘ ┴ └───────┘ ┴ ┴ ┴ ┴ └──
par ─┘ └────┘ ┴ └───────┘ ┴ ┴ ┴ ┴ └──
pid ─┘ └────┘ ┴ └───────┘ ┴ ┴ ┴ ┴ └──
st ───────────────────────────────────────────────────────────────────
549 have b1 : b > 1, from
src ─┘ └────┘ ┴ └────────
typ ─┘ └────┘ ┴ └────────
doc ─┘ └────┘ ┴ └────────
txt ─┘ └────┘ ┴ └────────
par ─┘ └────┘ ┴ └────────
pid ─┘ └────┘ ┴ └────────
st ────────────────────────
550 have u > xn a1 1, from x_increasing a1 m1,
id └┘ └──────────┘
src ───┘ └─┘ ┴└┘┴ └───────┘└──────────┘┴ ┴ └─
typ ───┘ └─┘ ┴└┘┴ └───────┘└──────────┘┴ ┴ └─
doc ───┘ └─┘ ┴└┘┴ └───────┘ ┴ ┴ └─
txt ───┘ └─┘ ┴ ┴ └───────┘ ┴ ┴ └─
par ───┘ └─┘ ┴ ┴ └───────┘ ┴ ┴ └─
pid ───┘ └─┘ ┴ ┴ └───────┘ ┴ ┴ └─
st ───────────────────────────────────────────────
551 have u > a, by simp at this; exact this,
id └──┘
src ───┘ └─┘ ┴ └───┘└──────────┘└──────┘ └─
typ ───┘ └─┘ ┴ └───┘└──────────┘└──────┘└──┘└─
doc ───┘ └─┘ ┴ └───┘└──────────┘└──────┘ └─
txt ───┘ └─┘ ┴ └───┘└──────────┘└──────┘ └─
par ───┘ └─┘ ┴ └───┘└──────────┘└──────┘ └─
pid ───┘ └─┘ ┴ └───────────────────────┘ └─
st ─────────────────┘└───────────────────────┘└─
552 lt_of_lt_of_le a1 $ by delta modeq at ba;
id └────────────┘
src ───┘└────────────┘┴ ┴ ┴ ┴└───────────────┘└─
typ ───┘└────────────┘┴ ┴ ┴ ┴└───────────────┘└─
doc ───┘ ┴ ┴ ┴ ┴└───────────────┘└─
txt ───┘ ┴ ┴ ┴ ┴└───────────────┘└─
par ───┘ ┴ ┴ ┴ ┴└───────────────┘└─
pid ───┘ ┴ ┴ ┴ └───────────────────
st ─────────────────────────┘└───────────────────
553 rw nat.mod_eq_of_lt this at ba; rw ← ba; apply nat.mod_le,
id └──────────────┘ └──┘ └┘ └────────┘
src ─────┘└─┘└──────────────┘┴ └────┘└┘└───┘ └┘└────┘└────────┘└─
typ ─────┘└─┘└──────────────┘┴└──┘└────┘└┘└───┘└┘└──────┘└────────┘└─
doc ─────┘└─┘ ┴ └────┘└┘└───┘ └┘└────┘ └─
txt ─────┘└─┘ ┴ └────┘└┘└───┘ └┘└────┘ └─
par ─────┘└─┘ ┴ └────┘└┘└───┘ └──────┘ └─
pid ────────┘ ┴ └───────────┘ └──────┘ └─
st ────────┘└──────────────┘└────────────────────────────────────┘└─
554 let s := xn b1 k, t := yn b1 k in
id └┘
src ─┘ └────┘ ┴ ┴ └─────┘└┘┴ ┴ └───
typ ─┘ └────┘ ┴ ┴ └─────┘└┘┴ ┴ └───
doc ─┘ └────┘ ┴ ┴ └─────┘└┘┴ ┴ └───
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └───
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └───
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └───
st ────────────────────────────────────
555 have sx : s ≡ x [MOD u], from (xy_modeq_of_modeq b1 a1 ba k).left,
id ┴ ┴ └───────────────┘
src ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ └───────────────┘┴ ┴ ┴ ┴ └───────
typ ─┘ └────┘ ┴ ┴┴┴ ┴┴ └─────┘ └───────────────┘┴ ┴ ┴ ┴ └───────
doc ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └───────
txt ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └───────
par ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └───────
pid ─┘ └────┘ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └───────
st ─────────────────────────────────────────────────────────────────────
556 have tk : t ≡ k [MOD 4 * y], from
src ─┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
typ ─┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
doc ─┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
txt ─┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
par ─┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
pid ─┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
st ────────────────────────────────────
557 have 4 * y ∣ b - 1, from int.coe_nat_dvd.1 $
id ┴ └─────────────┘
src ─────┘ └─┘ ┴ ┴ ┴ ┴┴└───────┘└─────────────┘└─┘ └
typ ─────┘ └─┘ ┴ ┴ ┴ ┴┴└───────┘└─────────────┘└─┘ └
doc ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
txt ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
par ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
pid ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
st ───────────────────────────────────────────────────
558 by rw int.coe_nat_sub (le_of_lt b1);
id └─────────────┘ └──────┘ └┘
src ───────┘ ┴└─┘└─────────────┘┴ └──────┘┴ ┴└─
typ ───────┘ ┴└─┘└─────────────┘┴ └──────┘┴└┘┴└─
doc ───────┘ ┴└─┘ ┴ ┴ ┴└─
txt ───────┘ ┴└─┘ ┴ ┴ ┴└─
par ───────┘ ┴└─┘ ┴ ┴ ┴└─
pid ───────┘ └──┘ ┴ ┴ └──
st ─────────┘└──────────────────────────────────
559 exact modeq.dvd_of_modeq bm1.symm,
id └────────────────┘ └──────┘
src ────────────────┘└────────────────┘┴└──────┘└─
typ ────────────────┘└────────────────┘┴└──────┘└─
doc ────────────────┘ ┴ └─
txt ────────────────┘ ┴ └─
par ────────────────┘ ┴ └─
pid ────────────────┘ ┴ └─
st ───────────────────────────────────────────┘└─
560 modeq.modeq_of_dvd_of_modeq this $ yn_modeq_a_sub_one _ _,
id └─────────────────────────┘ └────────────────┘
src ─────┘└─────────────────────────┘┴ ┴ ┴└────────────────┘└─────
typ ─────┘└─────────────────────────┘┴ ┴ ┴└────────────────┘└─────
doc ─────┘ ┴ ┴ ┴ └─────
txt ─────┘ ┴ ┴ ┴ └─────
par ─────┘ ┴ ┴ ┴ └─────
pid ─────┘ ┴ ┴ ┴ └─────
st ─────────────────────────────────────────────────────────────────
561 ⟨ky, or.inr ⟨u, v, s, t, b,
id └────┘ ┴ ┴
src ─┘ └┘└────┘┴ └┘ └┘ └┘ └┘ └─
typ ─┘ └┘└────┘┴ ┴└┘┴└┘ └┘ └┘ └─
doc ─┘ └┘ ┴ └┘ └┘ └┘ └┘ └─
txt ─┘ └┘ ┴ └┘ └┘ └┘ └┘ └─
par ─┘ └┘ ┴ └┘ └┘ └┘ └┘ └─
pid ─┘ └┘ ┴ └┘ └┘ └┘ └┘ └─
st ──────────────────────────────
562 pell_eq _ _, pell_eq _ _, pell_eq _ _, b1, bm1, ba, vp, yv, sx, tk⟩⟩,
id └─────┘ └┘
src ───┘ └────┘ └────┘└─────┘└────┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘
typ ───┘ └────┘ └────┘└─────┘└────┘ └┘ └┘ └┘ └┘└┘└┘ └┘ └┘
doc ───┘ └────┘ └────┘ └────┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘
txt ───┘ └────┘ └────┘ └────┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘
par ───┘ └────┘ └────┘ └────┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘
pid ───┘ └────┘ └────┘ └────┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘
st ───────────────────────────────────────────────────────────────────────┘
563 λ⟨a1, ky, o⟩, ⟨a1, match o with
id ┴└┘ └┘ ┴
typ ┴└┘ └┘ ┴
564 | or.inl ⟨x1, y0⟩ := by rw y0 at ky; rw [nat.eq_zero_of_le_zero ky, x1, y0]; exact ⟨rfl, rfl⟩
id └────┘ └┘ └────────────────────┘ └┘ └┘ └┘ └─┘
src └────┘ └─┘ └────┘ └──┘└────────────────────┘┴ └┘ └┘ ┴ └────┘ └┘└─┘└┘
typ └────┘ └─┘└┘└────┘ └──┘└────────────────────┘┴└┘└┘└┘└┘└┘┴ └────┘ └┘└─┘└┘
doc └─┘ └────┘ └──┘ ┴ └┘ └┘ ┴ └────┘ └┘ └┘
txt └─┘ └────┘ └──┘ ┴ └┘ └┘ ┴ └────┘ └┘ └┘
par └─┘ └────┘ └──┘ ┴ └┘ └┘ ┴ └────┘ └┘ └┘
pid ┴ └────┘ └┘ ┴ └┘ └┘ ┴ ┴ └┘ ┴┴
st └────────────────┘└───────────────────────┘└──┘└──┘┴└─────────────────┘
565 | or.inr ⟨u, v, s, t, b, xy, uv, st, b1, rem⟩ :=
id └────┘ ┴ ┴ ┴ ┴ ┴ └┘ └┘ └┘ └┘ └─┘
src └────┘
typ └────┘ ┴ ┴ ┴ ┴ ┴ └┘ └┘ └┘ └┘ └─┘
566 match x, y, eq_pell a1 xy, u, v, eq_pell a1 uv, s, t, eq_pell b1 st, rem, ky with
id ┴ ┴ └─────┘ └─────┘ └─────┘
src └─────┘ └─────┘ └─────┘
typ ┴ ┴ └─────┘ └─────┘ └─────┘
567 | ._, ._, ⟨i, rfl, rfl⟩, ._, ._, ⟨n, rfl, rfl⟩, ._, ._, ⟨j, rfl, rfl⟩,
id ┴ └─┘
src └─┘
typ ┴ └─┘
568 ⟨(bm1 : b ≡ 1 [MOD 4 * yn a1 i]),
id ┴ └──┘ ┴ └┘ ┴
src ┴ └──┘ ┴ └┘ ┴
typ ┴ └──┘ ┴ └┘ ┴
doc ┴ └──┘ └┘ ┴
569 (ba : b ≡ a [MOD xn a1 n]),
id ┴ ┴ └──┘ └┘ ┴
src ┴ └──┘ └┘ ┴
typ ┴ ┴ └──┘ └┘ ┴
doc ┴ └──┘ └┘ ┴
570 (vp : yn a1 n > 0),
id └┘ ┴
src └┘ ┴
typ └┘ ┴
doc └┘
571 (yv : yn a1 i * yn a1 i ∣ yn a1 n),
id └┘ ┴ └┘ ┴ └┘
src └┘ ┴ └┘ ┴ └┘
typ └┘ ┴ └┘ ┴ └┘
doc └┘ └┘ └┘
572 (sx : xn b1 j ≡ xn a1 i [MOD xn a1 n]),
id └┘ ┴ └┘ └──┘ └┘ ┴
src └┘ ┴ └┘ └──┘ └┘ ┴
typ └┘ ┴ └┘ └──┘ └┘ ┴
doc └┘ ┴ └┘ └──┘ └┘ ┴
573 (tk : yn b1 j ≡ k [MOD 4 * yn a1 i])⟩,
id └┘ ┴ ┴ └──┘ ┴ └┘ ┴
src └┘ ┴ └──┘ ┴ └┘ ┴
typ └┘ ┴ ┴ └──┘ ┴ └┘ ┴
doc └┘ ┴ └──┘ └┘ ┴
574 (ky : k ≤ yn a1 i) :=
id ┴ ┴ └┘
src ┴ └┘
typ ┴ ┴ └┘
doc └┘
575 (nat.eq_zero_or_pos i).elim
id └────────────────┘ └──┘
src └────────────────┘ └──┘
typ └────────────────┘ └──┘
576 (λi0, by simp [i0] at ky; rw [i0, ky]; exact ⟨rfl, rfl⟩) $ λipos,
id └┘ └┘ └┘ └┘ └─┘ └──┘
src └────┘ └─────┘ └──┘ └┘ ┴ └────┘ └┘└─┘┴
typ └┘ └────┘└┘└─────┘ └──┘└┘└┘└┘┴ └────┘ └┘└─┘┴ └──┘
doc └────┘ └─────┘ └──┘ └┘ ┴ └────┘ └┘ ┴
txt └────┘ └─────┘ └──┘ └┘ ┴ └────┘ └┘ ┴
par └────┘ └─────┘ └──┘ └┘ ┴ └────┘ └┘ ┴
pid ┴┴ ┴┴└───┘ └┘ └┘ ┴ ┴ └┘ ┴
st └────────────────────┘└┘└──┘┴└────────────────┘
577 suffices i = k, by rw this; exact ⟨rfl, rfl⟩,
id ┴ ┴ └──┘ └─┘
src ┴ └─┘ └────┘ └┘└─┘┴
typ ┴ ┴ └─┘└──┘ └────┘ └┘└─┘┴
doc └─┘ └────┘ └┘ ┴
txt └─┘ └────┘ └┘ ┴
par └─┘ └────┘ └┘ ┴
pid ┴ ┴ └┘ ┴
st └────────────────────────┘
578 by clear _x o rem xy uv st _match _match _fun_match; exact
src └──────────────────────────────────────────────┘ └─────
typ └──────────────────────────────────────────────┘ └─────
doc └──────────────────────────────────────────────┘ └─────
txt └──────────────────────────────────────────────┘ └─────
par └──────────────────────────────────────────────┘ └─────
pid └─────────────────────────────────────────┘ └
st └────────────────────────────────────────────────────────
579 have iln : i ≤ n, from le_of_not_gt $ λhin,
id └──────────┘
src ───┘ └─────┘ ┴ ┴ └─────┘└──────────┘┴ ┴ └────
typ ───┘ └─────┘ ┴ ┴ └─────┘└──────────┘┴ ┴ └────
doc ───┘ └─────┘ ┴ ┴ └─────┘ ┴ ┴ └────
txt ───┘ └─────┘ ┴ ┴ └─────┘ ┴ ┴ └────
par ───┘ └─────┘ ┴ ┴ └─────┘ ┴ ┴ └────
pid ───┘ └─────┘ ┴ ┴ └─────┘ ┴ ┴ └────
st ────────────────────────────────────────────────
580 not_lt_of_ge (nat.le_of_dvd vp (dvd_of_mul_left_dvd yv)) (y_increasing a1 hin),
id └──────────┘ └───────────┘ └┘ └─────────────────┘ └┘ └──────────┘ └┘
src ───┘└──────────┘┴ └───────────┘┴ ┴ └─────────────────┘┴ └─┘ └──────────┘┴ ┴ └──
typ ───┘└──────────┘┴ └───────────┘┴└┘┴ └─────────────────┘┴└┘└─┘ └──────────┘┴└┘┴ └──
doc ───┘ ┴ ┴ ┴ ┴ └─┘ ┴ ┴ └──
txt ───┘ ┴ ┴ ┴ ┴ └─┘ ┴ ┴ └──
par ───┘ ┴ ┴ ┴ ┴ └─┘ ┴ ┴ └──
pid ───┘ ┴ ┴ ┴ ┴ └─┘ ┴ ┴ └──
st ────────────────────────────────────────────────────────────────────────────────────
581 have yd : 4 * yn a1 i ∣ 4 * n, from mul_dvd_mul_left _ $ dvd_of_ysq_dvd a1 yv,
id └──────────────┘ └────────────┘
src ───┘ └──────┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─────┘└──────────────┘└─┘ ┴└────────────┘┴ ┴ └─
typ ───┘ └──────┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─────┘└──────────────┘└─┘ ┴└────────────┘┴ ┴ └─
doc ───┘ └──────┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─────┘ └─┘ ┴ ┴ ┴ └─
txt ───┘ └──────┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─────┘ └─┘ ┴ ┴ ┴ └─
par ───┘ └──────┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─────┘ └─┘ ┴ ┴ ┴ └─
pid ───┘ └──────┘ ┴ ┴ ┴ ┴ └─┘ ┴ └─────┘ └─┘ ┴ ┴ ┴ └─
st ───────────────────────────────────────────────────────────────────────────────────
582 have jk : j ≡ k [MOD 4 * yn a1 i], from
src ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
typ ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
doc ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
txt ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
par ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
pid ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
st ────────────────────────────────────────────
583 have 4 * yn a1 i ∣ b - 1, from int.coe_nat_dvd.1 $
id └┘ ┴ ┴ └─────────────┘
src ─────┘ └─┘ ┴└┘┴ ┴ ┴ ┴ ┴ └───────┘└─────────────┘└─┘ └
typ ─────┘ └─┘ ┴└┘┴ ┴┴┴ ┴┴┴ └───────┘└─────────────┘└─┘ └
doc ─────┘ └─┘ ┴└┘┴ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
txt ─────┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
par ─────┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
pid ─────┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ └───────┘ └─┘ └
st ─────────────────────────────────────────────────────────
584 by rw int.coe_nat_sub (le_of_lt b1); exact modeq.dvd_of_modeq bm1.symm,
id └─────────────┘ └──────┘ └┘ └────────────────┘ └──────┘
src ───────┘ ┴└─┘└─────────────┘┴ └──────┘┴ ┴└──────┘└────────────────┘┴└──────┘└─
typ ───────┘ ┴└─┘└─────────────┘┴ └──────┘┴└┘┴└──────┘└────────────────┘┴└──────┘└─
doc ───────┘ ┴└─┘ ┴ ┴ ┴└──────┘ ┴ └─
txt ───────┘ ┴└─┘ ┴ ┴ ┴└──────┘ ┴ └─
par ───────┘ ┴└─┘ ┴ ┴ ┴└──────┘ ┴ └─
pid ───────┘ └──┘ ┴ ┴ └───────┘ ┴ └─
st ─────────┘└──────────────────────────────────────────────────────────────────┘└─
585 (modeq.modeq_of_dvd_of_modeq this (yn_modeq_a_sub_one b1 _)).symm.trans tk,
id └─────────────────────────┘ └────────────────┘ └┘
src ─────┘ └─────────────────────────┘┴ ┴ └────────────────┘┴ └──────────────┘ └─
typ ─────┘ └─────────────────────────┘┴ ┴ └────────────────┘┴ └──────────────┘└┘└─
doc ─────┘ ┴ ┴ ┴ └──────────────┘ └─
txt ─────┘ ┴ ┴ ┴ └──────────────┘ └─
par ─────┘ ┴ ┴ ┴ └──────────────┘ └─
pid ─────┘ ┴ ┴ ┴ └──────────────┘ └─
st ──────────────────────────────────────────────────────────────────────────────────
586 have ki : k + i < 4 * yn a1 i, from
id ┴ ┴
src ───┘ └────┘ ┴┴┴ ┴ └─┘ ┴ ┴ ┴ └──────
typ ───┘ └────┘┴┴┴┴ ┴ └─┘ ┴ ┴ ┴ └──────
doc ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
txt ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
par ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
pid ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ ┴ ┴ └──────
st ────────────────────────────────────────
587 lt_of_le_of_lt (add_le_add ky (yn_ge_n a1 i)) $
id └────────────┘ └────────┘ └┘ └─────┘
src ─────┘└────────────┘┴ └────────┘┴ ┴ └─────┘┴ ┴ └─┘ └
typ ─────┘└────────────┘┴ └────────┘┴└┘┴ └─────┘┴ ┴ └─┘ └
doc ─────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └
txt ─────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └
par ─────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └
pid ─────┘ ┴ ┴ ┴ ┴ ┴ └─┘ └
st ──────────────────────────────────────────────────────
588 by rw ← two_mul; exact nat.mul_lt_mul_of_pos_right dec_trivial (y_increasing a1 ipos),
id └─────┘ └─────────────────────────┘ └─────────┘ └──────────┘ └┘ └──┘
src ─────┘ ┴└───┘└─────┘└──────┘└─────────────────────────┘┴└─────────┘┴ └──────────┘┴ ┴ └──
typ ─────┘ ┴└───┘└─────┘└──────┘└─────────────────────────┘┴└─────────┘┴ └──────────┘┴└┘┴└──┘└──
doc ─────┘ ┴└───┘ └──────┘ ┴└─────────┘┴ ┴ ┴ └──
txt ─────┘ ┴└───┘ └──────┘ ┴ ┴ ┴ ┴ └──
par ─────┘ ┴└───┘ └──────┘ ┴ ┴ ┴ ┴ └──
pid ─────┘ └────┘ └──────┘ ┴ ┴ ┴ ┴ └──
st ───────┘└─────────────────────────────────────────────────────────────────────────────────┘└─
589 have ji : j ≡ i [MOD 4 * n], from
src ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
typ ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
doc ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
txt ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
par ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
pid ───┘ └────┘ ┴ ┴ ┴ └─┘ ┴ └──────
st ──────────────────────────────────────
590 have xn a1 j ≡ xn a1 i [MOD xn a1 n], from (xy_modeq_of_modeq b1 a1 ba j).left.symm.trans sx,
id └┘ └───────────────┘ └┘ ┴ └┘
src ─────┘ └──┘ ┴ ┴ ┴└┘┴ ┴ ┴ ┴ ┴ ┴ └─────┘ └───────────────┘┴ ┴ ┴ ┴ └────────────────┘ └─
typ ─────┘ └──┘ ┴ ┴ ┴└┘┴ ┴ ┴ ┴ ┴ ┴ └─────┘ └───────────────┘┴ ┴ ┴└┘┴┴└────────────────┘└┘└─
doc ─────┘ └──┘ ┴ ┴ ┴└┘┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └────────────────┘ └─
txt ─────┘ └──┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └────────────────┘ └─
par ─────┘ └──┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └────────────────┘ └─
pid ─────┘ └──┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ └────────────────┘ └─
st ────────────────────────────────────────────────────────────────────────────────────────────────────
591 (modeq_of_xn_modeq a1 ipos iln this).resolve_right $ λ (ji : j + i ≡ 0 [MOD 4 * n]),
id └───────────────┘ ┴ └──┘ ┴┴
src ─────┘ └───────────────┘┴ ┴ ┴ ┴ └──────────────┘ ┴ └─────┘ ┴ ┴ ┴ └─┘ └─┘ ┴ └──
typ ─────┘ └───────────────┘┴ ┴ ┴ ┴ └──────────────┘ ┴ └─────┘ ┴ ┴ ┴┴└─┘└──┘└─┘ ┴┴┴└──
doc ─────┘ ┴ ┴ ┴ ┴ └──────────────┘ ┴ └─────┘ ┴ ┴ ┴ └─┘ └─┘ ┴ └──
txt ─────┘ ┴ ┴ ┴ ┴ └──────────────┘ ┴ └─────┘ ┴ ┴ ┴ └─┘ └─┘ ┴ └──
par ─────┘ ┴ ┴ ┴ ┴ └──────────────┘ ┴ └─────┘ ┴ ┴ ┴ └─┘ └─┘ ┴ └──
pid ─────┘ ┴ ┴ ┴ ┴ └──────────────┘ ┴ └─────┘ ┴ ┴ ┴ └─┘ └─┘ ┴ └──
st ───────────────────────────────────────────────────────────────────────────────────────────
592 not_le_of_gt ki $ nat.le_of_dvd (lt_of_lt_of_le ipos $ nat.le_add_left _ _) $
id └──────────┘ └────────────┘ └─────────────┘
src ─────┘└──────────┘┴ ┴ ┴ ┴ └────────────┘┴ ┴ ┴└─────────────┘└────┘ └
typ ─────┘└──────────┘┴ ┴ ┴ ┴ └────────────┘┴ ┴ ┴└─────────────┘└────┘ └
doc ─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────┘ └
txt ─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────┘ └
par ─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────┘ └
pid ─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────┘ └
st ────────────────────────────────────────────────────────────────────────────────────
593 modeq.modeq_zero_iff.1 $ (modeq.modeq_add jk.symm (modeq.refl i)).trans $
id └──────────────────┘ └─────────────┘ └───┘ └────────┘
src ─────┘└──────────────────┘└─┘ ┴ └─────────────┘┴ └───┘┴ └────────┘┴ └───────┘ └
typ ─────┘└──────────────────┘└─┘ ┴ └─────────────┘┴ └───┘┴ └────────┘┴ └───────┘ └
doc ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └
txt ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └
par ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └
pid ─────┘ └─┘ ┴ ┴ ┴ ┴ └───────┘ └
st ────────────────────────────────────────────────────────────────────────────────
594 modeq.modeq_of_dvd_of_modeq yd ji,
src ─────┘ ┴ ┴ └─
typ ─────┘ ┴ ┴ └─
doc ─────┘ ┴ ┴ └─
txt ─────┘ ┴ ┴ └─
par ─────┘ ┴ ┴ └─
pid ─────┘ ┴ ┴ └─
st ─────────────────────────────────────────
595 by have : i % (4 * yn a1 i) = k % (4 * yn a1 i) :=
id ┴ ┴ ┴ └┘ └┘ ┴
src ───┘ ┴└─────┘ ┴┴┴ └┘ ┴ ┴ ┴ └┘┴┴ ┴ ┴ └┘ ┴└┘┴ ┴ └────
typ ───┘ ┴└─────┘ ┴┴┴ └┘ ┴ ┴ ┴ └┘┴┴┴┴ ┴ └┘ ┴└┘┴└┘┴┴└────
doc ───┘ ┴└─────┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴└┘┴ ┴ └────
txt ───┘ ┴└─────┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └────
par ───┘ ┴└─────┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └────
pid ───┘ └──────┘ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └────
st ─────┘└────────────────────────────────────────────────
596 (modeq.modeq_of_dvd_of_modeq yd ji).symm.trans jk;
id └─────────────────────────┘ └┘ └┘ └┘
src ────────┘ └─────────────────────────┘┴ ┴ └───────────┘ └─
typ ────────┘ └─────────────────────────┘┴└┘┴└┘└───────────┘└┘└─
doc ────────┘ ┴ ┴ └───────────┘ └─
txt ────────┘ ┴ ┴ └───────────┘ └─
par ────────┘ ┴ ┴ └───────────┘ └─
pid ────────┘ ┴ ┴ └───────────┘ └─
st ────────────────────────────────────────────────────────────
597 rwa [nat.mod_eq_of_lt (lt_of_le_of_lt (nat.le_add_left _ _) ki),
id └──────────────┘ └────────────┘ └─────────────┘ └┘
src ──────┘└───┘└──────────────┘┴ └────────────┘┴ └─────────────┘└────┘ └──
typ ──────┘└───┘└──────────────┘┴ └────────────┘┴ └─────────────┘└────┘└┘└──
doc ──────┘└───┘ ┴ ┴ └────┘ └──
txt ──────┘└───┘ ┴ ┴ └────┘ └──
par ──────┘└───┘ ┴ ┴ └────┘ └──
pid ───────────┘ ┴ ┴ └────┘ └──
st ───────────┘└────────────────────────────────────────────────────────┘└─
598 nat.mod_eq_of_lt (lt_of_le_of_lt (nat.le_add_right _ _) ki)] at this
id └──────────────┘ └────────────┘ └──────────────┘ └┘
src ───────────┘└──────────────┘┴ └────────────┘┴ └──────────────┘└────┘ └──────────
typ ───────────┘└──────────────┘┴ └────────────┘┴ └──────────────┘└────┘└┘└──────────
doc ───────────┘ ┴ ┴ └────┘ └──────────
txt ───────────┘ ┴ ┴ └────┘ └──────────
par ───────────┘ ┴ ┴ └────┘ └──────────
pid ───────────┘ ┴ ┴ └────┘ └──────────
st ──────────────────────────────────────────────────────────────────────┘┴└────────
599 end
src ─┘
typ ─┘
doc ─┘
txt ─┘
par ─┘
pid ─┘
st ─┘
600 end⟩⟩
601
602 lemma eq_pow_of_pell_lem {a y k} (a1 : 1 < a) (ypos : y > 0) : k > 0 → a > y^k →
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴┴┴
src ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴┴┴
603 (↑(y^k) : ℤ) < 2*a*y - y*y - 1 :=
id ┴ ┴┴┴ ┴ ┴ ┴┴┴┴ ┴ ┴┴┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴┴┴ ┴ ┴ ┴┴┴┴ ┴ ┴┴┴ ┴
604 have y < a → 2*a*y ≥ a + (y*y + 1), begin
id ┴ ┴ ┴ ┴┴┴┴ ┴ ┴ ┴ ┴┴┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴┴┴┴ ┴ ┴ ┴ ┴┴┴ ┴
st └─────
605 intro ya, induction y with y IH, exact absurd ypos (lt_irrefl _),
id ┴ └────┘ └──┘ └───────┘
src └──────┘ └────────┘ └────────┘ └────┘└────┘┴ ┴ └───────┘└─┘
typ └──────┘ └────────┘┴└────────┘ └────┘└────┘┴└──┘┴ └───────┘└─┘
doc └──────┘ └────────┘ └────────┘ └────┘ ┴ ┴ └─┘
txt └──────┘ └────────┘ └────────┘ └────┘ ┴ ┴ └─┘
par └──────┘ └────────┘ └────────┘ └────┘ ┴ ┴ └─┘
pid └─┘ ┴ ┴└───────┘ ┴ ┴ ┴ └─┘
st ─────────┘└─────────────────────┘└───────────────────────────────┘└─
606 cases nat.eq_zero_or_pos y with y0 ypos,
id └────────────────┘ ┴
src └────┘└────────────────┘┴ └───────────┘
typ └────┘└────────────────┘┴┴└───────────┘
doc └────┘ ┴ └───────────┘
txt └────┘ ┴ └───────────┘
par └────┘ ┴ └───────────┘
pid ┴ ┴ └───────────┘
st ────────────────────────────────────────┘└─
607 { rw y0, simpa [two_mul], },
id └┘ └─────┘
src └─┘ └─────┘└─────┘┴
typ └─┘└┘ └─────┘└─────┘┴
doc └─┘ └─────┘ ┴
txt └─┘ └─────┘ ┴
par └─┘ └─────┘ ┴
pid ┴ ┴┴ ┴
st ───┘└───┘└───────────────┘└──┘└
608 { rw [nat.mul_succ, nat.mul_succ, nat.succ_mul y],
id └──────────┘ └──────────┘ └──────────┘ ┴
src └──┘└──────────┘└┘└──────────┘└┘└──────────┘┴ ┴
typ └──┘└──────────┘└┘└──────────┘└┘└──────────┘┴┴┴
doc └──┘ └┘ └┘ ┴ ┴
txt └──┘ └┘ └┘ ┴ ┴
par └──┘ └┘ └┘ ┴ ┴
pid └┘ └┘ └┘ ┴ ┴
st ───────────────────┘└────────────┘└──────────────┘┴└─
609 have : 2 * a ≥ y + nat.succ y,
id ┴ ┴ ┴ ┴ └──────┘ ┴
src └───────┘┴┴ ┴┴┴ ┴┴┴└──────┘┴
typ └───────┘┴┴┴┴┴┴ ┴┴┴└──────┘┴┴
doc └───────┘ ┴ ┴ ┴ ┴ ┴ ┴
txt └───────┘ ┴ ┴ ┴ ┴ ┴ ┴
par └───────┘ ┴ ┴ ┴ ┴ ┴ ┴
pid └───┘└──┘ ┴ ┴ ┴ ┴ ┴ ┴
st ────────────────────────────────┘└─
610 { change y + y < 2 * a, rw ← two_mul,
id ┴ ┴ ┴ └─────┘
src └─────┘ ┴ ┴ ┴┴└─┘ ┴ └───┘└─────┘
typ └─────┘ ┴ ┴┴┴┴└─┘ ┴┴ └───┘└─────┘
doc └─────┘ ┴ ┴ ┴ └─┘ ┴ └───┘
txt └─────┘ ┴ ┴ ┴ └─┘ ┴ └───┘
par └─────┘ ┴ ┴ ┴ └─┘ ┴ └───┘
pid ┴ ┴ ┴ ┴ └─┘ ┴ └─┘
st ─────┘└──────────────────┘└────────────┘└─
611 exact mul_lt_mul_of_pos_left (nat.lt_of_succ_lt ya) dec_trivial },
id └────────────────────┘ └───────────────┘ └┘ └─────────┘
src └────┘└────────────────────┘┴ └───────────────┘┴ └┘└─────────┘┴
typ └────┘└────────────────────┘┴ └───────────────┘┴└┘└┘└─────────┘┴
doc └────┘ ┴ ┴ └┘└─────────┘┴
txt └────┘ ┴ ┴ └┘ ┴
par └────┘ ┴ ┴ └┘ ┴
pid ┴ ┴ ┴ └┘ ┴
st ─────────────────────────────────────────────────────────────────────┘└┘└
612 have := add_le_add (IH ypos (nat.lt_of_succ_lt ya)) this,
id └────────┘ └┘ └──┘ └───────────────┘ └┘ └──┘
src └──────┘└────────┘┴ ┴ ┴ └───────────────┘┴ └─┘
typ └──────┘└────────┘┴ └┘┴└──┘┴ └───────────────┘┴└┘└─┘└──┘
doc └──────┘ ┴ ┴ ┴ ┴ └─┘
txt └──────┘ ┴ ┴ ┴ ┴ └─┘
par └──────┘ ┴ ┴ ┴ ┴ └─┘
pid └───┘└─┘ ┴ ┴ ┴ ┴ └─┘
st ───────────────────────────────────────────────────────────┘└─
613 simpa }
src └────┘
typ └────┘
doc └────┘
txt └────┘
par └────┘
pid ┴
st ─────────┘└─
614 end, λk0 yak,
id └┘ └─┘
typ └┘ └─┘
st ──┘
615 lt_of_lt_of_le (int.coe_nat_lt_coe_nat_of_lt yak) $
id └────────────┘ └──────────────────────────┘ └─┘
src └────────────┘ └──────────────────────────┘
typ └────────────┘ └──────────────────────────┘ └─┘
616 by rw sub_sub; apply le_sub_right_of_add_le;
id └─────┘ └────────────────────┘
src └─┘└─────┘ └────┘└────────────────────┘
typ └─┘└─────┘ └────┘└────────────────────┘
doc └─┘ └────┘
txt └─┘ └────┘
par └─┘ └────┘
pid ┴ ┴
st └──────────────────────────────────────────
617 apply int.coe_nat_le_coe_nat_of_le;
id └──────────────────────────┘
src └────┘└──────────────────────────┘
typ └────┘└──────────────────────────┘
doc └────┘
txt └────┘
par └────┘
pid ┴
st ───────────────────────────────────────
618 have y1 := nat.pow_le_pow_of_le_right ypos k0; simp at y1;
id └────────────────────────┘ └──┘ └┘
src └─────────┘└────────────────────────┘┴ ┴ └────────┘
typ └─────────┘└────────────────────────┘┴└──┘┴└┘ └────────┘
doc └─────────┘ ┴ ┴ └────────┘
txt └─────────┘ ┴ ┴ └────────┘
par └─────────┘ ┴ ┴ └────────┘
pid └─────┘┴└─┘ ┴ ┴ ┴└───┘
st ──────────────────────────────────────────────────────────────
619 exact this (lt_of_le_of_lt y1 yak)
id └──┘ └────────────┘ └┘ └─┘
src └────┘ ┴ └────────────┘┴ ┴ └─
typ └────┘└──┘┴ └────────────┘┴└┘┴└─┘└─
doc └────┘ ┴ ┴ ┴ └─
txt └────┘ ┴ ┴ ┴ └─
par └────┘ ┴ ┴ ┴ └─
pid ┴ ┴ ┴ ┴ ┴└
st ──────────────────────────────────────
620
src ┘
typ ┘
doc ┘
txt ┘
par ┘
pid ┘
st ┘
621 theorem eq_pow_of_pell {m n k} : (n^k = m ↔
id ┴┴┴ ┴ ┴ ┴
src ┴┴ ┴ ┴
typ ┴┴┴ ┴ ┴ ┴
622 k = 0 ∧ m = 1 ∨ k > 0 ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
623 (n = 0 ∧ m = 0 ∨ n > 0 ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
624 ∃ (w a t z : ℕ) (a1 : a > 1),
id ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴
625 xn a1 k ≡ yn a1 k * (a - n) + m [MOD t] ∧
id └┘ └┘ ┴ ┴ └┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴┴ ┴
src └┘ ┴ └┘ ┴ ┴ ┴ └──┘ ┴ ┴
typ └┘ └┘ ┴ ┴ └┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴┴ ┴
doc └┘ ┴ └┘ └──┘ ┴
626 2 * a * n = t + (n * n + 1) ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
627 m < t ∧ n ≤ w ∧ k ≤ w ∧
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
628 a * a - ((w + 1) * (w + 1) - 1) * (w * z) * (w * z) = 1)) :=
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
629 ⟨λe, by rw ← e;
id ┴ ┴
src └───┘
typ ┴ └───┘┴
doc └───┘
txt └───┘
par └───┘
pid └─┘
st └────────
630 refine (nat.eq_zero_or_pos k).elim
id └────────────────┘ ┴
src └─────┘ └────────────────┘┴ └──────
typ └─────┘ └────────────────┘┴┴└──────
doc └─────┘ ┴ └──────
txt └─────┘ ┴ └──────
par └─────┘ ┴ └──────
pid ┴ ┴ └──────
st ─────────────────────────────────────
631 (λk0, by rw k0; exact or.inl ⟨rfl, rfl⟩)
id └┘ └────┘ └─┘
src ───┘ └──┘ ┴└─┘ └┘└────┘└────┘┴ └┘└─┘┴└─
typ ───┘ └──┘ ┴└─┘└┘└──────┘└────┘┴ └┘└─┘└──
doc ───┘ └──┘ ┴└─┘ └┘└────┘ ┴ └┘ ┴└─
txt ───┘ └──┘ ┴└─┘ └┘└────┘ ┴ └┘ ┴└─
par ───┘ └──┘ ┴└─┘ └──────┘ ┴ └┘ └──
pid ───┘ └──┘ └──┘ └──────┘ ┴ └┘ └──
st ───────────┘└─────────────────────────────┘└─
632 (λkpos, or.inr ⟨kpos, _⟩);
id └────┘
src ───┘ └────┘└────┘┴ └───┘
typ ───┘ └────┘└────┘┴ └───┘
doc ───┘ └────┘ ┴ └───┘
txt ───┘ └────┘ ┴ └───┘
par ───┘ └────┘ ┴ └───┘
pid ───┘ └────┘ ┴ └───┘
st ───────────────────────────────
633 refine (nat.eq_zero_or_pos n).elim
id └────────────────┘ ┴
src └─────┘ └────────────────┘┴ └──────
typ └─────┘ └────────────────┘┴┴└──────
doc └─────┘ ┴ └──────
txt └─────┘ ┴ └──────
par └─────┘ ┴ └──────
pid ┴ ┴ └──────
st ─────────────────────────────────────
634 (λn0, by rw [n0, nat.zero_pow kpos]; exact or.inl ⟨rfl, rfl⟩)
id └┘ └──────────┘ └──┘ └────┘ └─┘
src ───┘ └──┘ ┴└──┘ └┘└──────────┘┴ ┴└┘└────┘└────┘┴ └┘└─┘┴└─
typ ───┘ └──┘ ┴└──┘└┘└┘└──────────┘┴└──┘┴└──────┘└────┘┴ └┘└─┘└──
doc ───┘ └──┘ ┴└──┘ └┘ ┴ ┴└┘└────┘ ┴ └┘ ┴└─
txt ───┘ └──┘ ┴└──┘ └┘ ┴ ┴└┘└────┘ ┴ └┘ ┴└─
par ───┘ └──┘ ┴└──┘ └┘ ┴ ┴└──────┘ ┴ └┘ └──
pid ───┘ └──┘ └───┘ └┘ ┴ └───────┘ ┴ └┘ └──
st ───────────┘└─────┘└─────────────────┘┴└───────────────────────┘└─
635 (λnpos, or.inr ⟨npos, _⟩); exact
id └────┘
src ───┘ └────┘└────┘┴ └───┘ └─────
typ ───┘ └────┘└────┘┴ └───┘ └─────
doc ───┘ └────┘ ┴ └───┘ └─────
txt ───┘ └────┘ ┴ └───┘ └─────
par ───┘ └────┘ ┴ └───┘ └─────
pid ───┘ └────┘ ┴ └───┘ └
st ─────────────────────────────────────
636 let w := _root_.max n k in
id └────────┘
src ─┘ └────┘└────────┘┴ ┴ └───
typ ─┘ └────┘└────────┘┴ ┴ └───
doc ─┘ └────┘ ┴ ┴ └───
txt ─┘ └────┘ ┴ ┴ └───
par ─┘ └────┘ ┴ ┴ └───
pid ─┘ └────┘ ┴ ┴ └───
st ─────────────────────────────
637 have nw : n ≤ w, from le_max_left _ _,
id ┴ └─────────┘
src ─┘ └────┘ ┴┴┴ └─────┘└─────────┘└─────
typ ─┘ └────┘ ┴┴┴ └─────┘└─────────┘└─────
doc ─┘ └────┘ ┴ ┴ └─────┘ └─────
txt ─┘ └────┘ ┴ ┴ └─────┘ └─────
par ─┘ └────┘ ┴ ┴ └─────┘ └─────
pid ─┘ └────┘ ┴ ┴ └─────┘ └─────
st ─────────────────────────────────────────
638 have kw : k ≤ w, from le_max_right _ _,
id └──────────┘
src ─┘ └────┘ ┴ ┴ └─────┘└──────────┘└─────
typ ─┘ └────┘ ┴ ┴ └─────┘└──────────┘└─────
doc ─┘ └────┘ ┴ ┴ └─────┘ └─────
txt ─┘ └────┘ ┴ ┴ └─────┘ └─────
par ─┘ └────┘ ┴ ┴ └─────┘ └─────
pid ─┘ └────┘ ┴ ┴ └─────┘ └─────
st ──────────────────────────────────────────
639 have wpos : w > 0, from lt_of_lt_of_le npos nw,
id ┴ └────────────┘ └──┘
src ─┘ └──────┘ ┴┴└───────┘└────────────┘┴ ┴ └─
typ ─┘ └──────┘ ┴┴└───────┘└────────────┘┴└──┘┴ └─
doc ─┘ └──────┘ ┴ └───────┘ ┴ ┴ └─
txt ─┘ └──────┘ ┴ └───────┘ ┴ ┴ └─
par ─┘ └──────┘ ┴ └───────┘ ┴ ┴ └─
pid ─┘ └──────┘ ┴ └───────┘ ┴ ┴ └─
st ──────────────────────────────────────────────────
640 have w1 : w + 1 > 1, from nat.succ_lt_succ wpos,
id ┴ └──────────────┘
src ─┘ └────┘ ┴┴└─┘ └───────┘└──────────────┘┴ └─
typ ─┘ └────┘ ┴┴└─┘ └───────┘└──────────────┘┴ └─
doc ─┘ └────┘ ┴ └─┘ └───────┘ ┴ └─
txt ─┘ └────┘ ┴ └─┘ └───────┘ ┴ └─
par ─┘ └────┘ ┴ └─┘ └───────┘ ┴ └─
pid ─┘ └────┘ ┴ └─┘ └───────┘ ┴ └─
st ───────────────────────────────────────────────────
641 let a := xn w1 w in
src ─┘ └────┘ ┴ ┴ └───
typ ─┘ └────┘ ┴ ┴ └───
doc ─┘ └────┘ ┴ ┴ └───
txt ─┘ └────┘ ┴ ┴ └───
par ─┘ └────┘ ┴ ┴ └───
pid ─┘ └────┘ ┴ ┴ └───
st ──────────────────────
642 have a1 : a > 1, from x_increasing w1 wpos,
id └──────────┘
src ─┘ └────┘ ┴ └───────┘└──────────┘┴ ┴ └─
typ ─┘ └────┘ ┴ └───────┘└──────────┘┴ ┴ └─
doc ─┘ └────┘ ┴ └───────┘ ┴ ┴ └─
txt ─┘ └────┘ ┴ └───────┘ ┴ ┴ └─
par ─┘ └────┘ ┴ └───────┘ ┴ ┴ └─
pid ─┘ └────┘ ┴ └───────┘ ┴ ┴ └─
st ──────────────────────────────────────────────
643 let x := xn a1 k, y := yn a1 k in
id └┘
src ─┘ └────┘└┘┴ ┴ └─────┘ ┴ ┴ └───
typ ─┘ └────┘└┘┴ ┴ └─────┘ ┴ ┴ └───
doc ─┘ └────┘└┘┴ ┴ └─────┘ ┴ ┴ └───
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └───
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └───
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ └───
st ────────────────────────────────────
644 let ⟨z, ze⟩ := show w ∣ yn w1 w, from modeq.modeq_zero_iff.1 $
id ┴ ┴ └┘
src ─┘ ┴ └┘ └───┘ ┴ ┴┴┴└┘┴ ┴ └─────┘ └─┘ └
typ ─┘ ┴ ┴└┘ └───┘ ┴ ┴┴┴└┘┴ ┴ └─────┘ └─┘ └
doc ─┘ ┴ └┘ └───┘ ┴ ┴ ┴└┘┴ ┴ └─────┘ └─┘ └
txt ─┘ ┴ └┘ └───┘ ┴ ┴ ┴ ┴ ┴ └─────┘ └─┘ └
par ─┘ ┴ └┘ └───┘ ┴ ┴ ┴ ┴ ┴ └─────┘ └─┘ └
pid ─┘ ┴ └┘ └───┘ ┴ ┴ ┴ ┴ ┴ └─────┘ └─┘ └
st ─────────────────────────────────────────────────────────────────
645 modeq.trans (yn_modeq_a_sub_one w1 w) (modeq.modeq_zero_iff.2 $ dvd_refl _) in
id └─────────┘ └────────────────┘ └──────────────────┘ └──────┘
src ───┘└─────────┘┴ └────────────────┘┴ ┴ └┘ └──────────────────┘└─┘ ┴└──────┘└──────
typ ───┘└─────────┘┴ └────────────────┘┴ ┴ └┘ └──────────────────┘└─┘ ┴└──────┘└──────
doc ───┘ ┴ ┴ ┴ └┘ └─┘ ┴ └──────
txt ───┘ ┴ ┴ ┴ └┘ └─┘ ┴ └──────
par ───┘ ┴ ┴ ┴ └┘ └─┘ ┴ └──────
pid ───┘ ┴ ┴ ┴ └┘ └─┘ ┴ └──────
st ───────────────────────────────────────────────────────────────────────────────────
646 have nt : (↑(n^k) : ℤ) < 2 * a * n - n * n - 1, from
id ┴ ┴ ┴ ┴ ┴ ┴
src ─┘ └────┘ ┴ ┴ └──┘┴└┘┴└─┘ ┴ ┴┴┴ ┴ ┴ ┴ ┴ ┴┴└────────
typ ─┘ └────┘ ┴ ┴ └──┘┴└┘┴└─┘ ┴ ┴┴┴ ┴ ┴ ┴ ┴ ┴┴└────────
doc ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
txt ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
par ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
pid ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
st ───────────────────────────────────────────────────────
647 eq_pow_of_pell_lem a1 npos kpos $ calc
id └────────────────┘ └──┘
src ───┘└────────────────┘┴ ┴ ┴ ┴ ┴ └
typ ───┘└────────────────┘┴ ┴ ┴└──┘┴ ┴ └
doc ───┘ ┴ ┴ ┴ ┴ ┴ └
txt ───┘ ┴ ┴ ┴ ┴ ┴ └
par ───┘ ┴ ┴ ┴ ┴ ┴ └
pid ───┘ ┴ ┴ ┴ ┴ ┴ └
st ───────────────────────────────────────────
648 n^k ≤ n^w : nat.pow_le_pow_of_le_right npos kw
id ┴ ┴ └────────────────────────┘
src ─────┘ ┴ ┴ └───────┘└────────────────────────┘┴ ┴ └
typ ─────┘ ┴┴ ┴┴ └───────┘└────────────────────────┘┴ ┴ └
doc ─────┘ ┴ ┴ └───────┘ ┴ ┴ └
txt ─────┘ ┴ ┴ └───────┘ ┴ ┴ └
par ─────┘ ┴ ┴ └───────┘ ┴ ┴ └
pid ─────┘ ┴ ┴ └───────┘ ┴ ┴ └
st ───────────────────────────────────────────────────────────
649 ... < (w + 1)^w : nat.pow_lt_pow_of_lt_left (nat.lt_succ_of_le nw) wpos
id └───────────────────────┘ └───────────────┘
src ─────────┘ ┴ ┴ └─┘ └─┘└───────────────────────┘┴ └───────────────┘┴ └┘ └
typ ─────────┘ ┴ ┴ └─┘ └─┘└───────────────────────┘┴ └───────────────┘┴ └┘ └
doc ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
txt ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
par ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
pid ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
st ──────────────────────────────────────────────────────────────────────────────
650 ... ≤ a : xn_ge_a_pow w1 w,
id └─────────┘
src ─────────┘ ┴ └─────────┘└─────────┘┴ ┴ └─
typ ─────────┘ ┴ └─────────┘└─────────┘┴ ┴ └─
doc ─────────┘ ┴ └─────────┘ ┴ ┴ └─
txt ─────────┘ ┴ └─────────┘ ┴ ┴ └─
par ─────────┘ ┴ └─────────┘ ┴ ┴ └─
pid ─────────┘ ┴ └─────────┘ ┴ ┴ └─
st ──────────────────────────────────────────
651 let ⟨t, te⟩ := int.eq_coe_of_zero_le $
id ┴ └───────────────────┘
src ─┘ ┴ └┘ └───┘└───────────────────┘┴ └
typ ─┘ ┴ ┴└┘ └───┘└───────────────────┘┴ └
doc ─┘ ┴ └┘ └───┘ ┴ └
txt ─┘ ┴ └┘ └───┘ ┴ └
par ─┘ ┴ └┘ └───┘ ┴ └
pid ─┘ ┴ └┘ └───┘ ┴ └
st ─────────────────────────────────────────
652 le_trans (int.coe_zero_le _) $ le_of_lt nt in
id └──────┘ └─────────────┘ └──────┘
src ───┘└──────┘┴ └─────────────┘└──┘ ┴└──────┘┴ └───
typ ───┘└──────┘┴ └─────────────┘└──┘ ┴└──────┘┴ └───
doc ───┘ ┴ └──┘ ┴ ┴ └───
txt ───┘ ┴ └──┘ ┴ ┴ └───
par ───┘ ┴ └──┘ ┴ ┴ └───
pid ───┘ ┴ └──┘ ┴ ┴ └───
st ──────────────────────────────────────────────────
653 have na : n ≤ a, from le_trans nw $ le_of_lt $ n_lt_xn w1 w,
id ┴ └─────┘
src ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴└─────┘┴ ┴ └─
typ ─┘ └────┘ ┴ ┴┴└─────┘ ┴ ┴ ┴ ┴ ┴└─────┘┴ ┴ └─
doc ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─
st ───────────────────────────────────────────────────────────────
654 have tm : x ≡ y * (a - n) + n^k [MOD t], begin
id ┴
src ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └───────
typ ─┘ └────┘ ┴ ┴ ┴ ┴ ┴┴ ┴ └┘ ┴ ┴ ┴ └───────
doc ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └───────
txt ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └───────
par ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └───────
pid ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └───────
st ───────────────────────────────────────────────┘└
655 apply modeq.modeq_of_dvd,
id └────────────────┘
src ───┘└────┘└────────────────┘└─
typ ─────────┘└────────────────┘└─
doc ───┘└────┘ └─
txt ───┘└────┘ └─
par ─────────┘ └─
pid ─────────┘ └─
st ───────────────────────────┘└─
656 rw [int.coe_nat_add, int.coe_nat_mul, int.coe_nat_sub na, ← te],
id └─────────────┘ └─────────────┘ └─────────────┘ └┘ └┘
src ───┘└──┘└─────────────┘└┘└─────────────┘└┘└─────────────┘┴ └──┘ ┴└─
typ ───┘└──┘└─────────────┘└┘└─────────────┘└┘└─────────────┘┴└┘└──┘└┘┴└─
doc ───┘└──┘ └┘ └┘ ┴ └──┘ ┴└─
txt ───┘└──┘ └┘ └┘ ┴ └──┘ ┴└─
par ───┘└──┘ └┘ └┘ ┴ └──┘ ┴└─
pid ───────┘ └┘ └┘ ┴ └──┘ └──
st ──────────────────────┘└───────────────┘└──────────────────┘└────┘└──
657 exact x_sub_y_dvd_pow a1 n k
id └─────────────┘ └┘ ┴ ┴
src ─────────┘└─────────────┘┴ ┴ ┴ └
typ ─────────┘└─────────────┘┴└┘┴┴┴┴└
doc ─────────┘ ┴ ┴ ┴ └
txt ─────────┘ ┴ ┴ ┴ └
par ─────────┘ ┴ ┴ ┴ └
pid ─────────┘ ┴ ┴ ┴ └
st ─────────────────────────────────
658 end,
src ───────
typ ───────
doc ───────
txt ───────
par ───────
pid ───────
st ─┘└─┘└─
659 have ta : 2 * a * n = t + (n * n + 1), from int.coe_nat_inj $
id ┴ ┴ └─────────────┘
src ─┘ └──────┘ ┴ ┴ ┴ ┴┴┴ ┴ ┴ ┴ ┴ ┴ └────────┘└─────────────┘┴ └
typ ─┘ └──────┘ ┴┴┴ ┴ ┴┴┴ ┴ ┴ ┴ ┴ ┴ └────────┘└─────────────┘┴ └
doc ─┘ └──────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────┘ ┴ └
txt ─┘ └──────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────┘ ┴ └
par ─┘ └──────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────┘ ┴ └
pid ─┘ └──────┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────┘ ┴ └
st ────────────────────────────────────────────────────────────────
660 by rw [int.coe_nat_add, ← te, sub_sub];
id └─────────────┘ └┘ └─────┘
src ───┘ ┴└──┘└─────────────┘└──┘ └┘└─────┘┴└─
typ ───┘ ┴└──┘└─────────────┘└──┘└┘└┘└─────┘┴└─
doc ───┘ ┴└──┘ └──┘ └┘ ┴└─
txt ───┘ ┴└──┘ └──┘ └┘ ┴└─
par ───┘ ┴└──┘ └──┘ └┘ ┴└─
pid ───┘ └───┘ └──┘ └┘ └──
st ─────┘└──────────────────┘└────┘└───────┘┴└─
661 repeat {rw int.coe_nat_add <|> rw int.coe_nat_mul};
id └─────────────┘ └─────────────┘
src ──────┘└──────┘└─┘└─────────────┘┴└──┘└─┘└─────────────┘┴└─
typ ──────┘└──────┘└─┘└─────────────┘┴└──┘└─┘└─────────────┘┴└─
doc ──────┘└──────┘└─┘ ┴└──┘└─┘ ┴└─
txt ──────┘└──────┘└─┘ ┴└──┘└─┘ ┴└─
par ──────┘└──────┘└─┘ ┴└──┘└─┘ ┴└─
pid ─────────────────┘ └──────┘ └──
st ──────────────┘└────────────────────────┘└──────────────┘└─
662 rw [int.coe_nat_one, sub_add_cancel]; refl,
id └─────────────┘ └────────────┘
src ──────┘└──┘└─────────────┘└┘└────────────┘┴└┘└──┘└─
typ ──────┘└──┘└─────────────┘└┘└────────────┘┴└┘└──┘└─
doc ──────┘└──┘ └┘ ┴└┘└──┘└─
txt ──────┘└──┘ └┘ ┴└┘└──┘└─
par ──────┘└──┘ └┘ ┴└┘└──┘└─
pid ──────────┘ └┘ └────────
st ──────────┘└─────────────┘└──────────────┘┴└────┘└─
663 have mt : n^k < t, from int.lt_of_coe_nat_lt_coe_nat $
id └──────────────────────────┘
src ─┘ └────┘ ┴ ┴ └─────┘└──────────────────────────┘┴ └
typ ─┘ └────┘ ┴ ┴ └─────┘└──────────────────────────┘┴ └
doc ─┘ └────┘ ┴ ┴ └─────┘ ┴ └
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ └
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ └
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ └
st ─────────────────────────────────────────────────────────
664 by rw ← te; exact nt,
id └┘ └┘
src ───┘ ┴└───┘ └──────┘ └─
typ ───┘ ┴└───┘└┘└──────┘└┘└─
doc ───┘ ┴└───┘ └──────┘ └─
txt ───┘ ┴└───┘ └──────┘ └─
par ───┘ ┴└───┘ └──────┘ └─
pid ───┘ └────┘ └──────┘ └─
st ─────┘└────────────────┘└─
665 have zp : a * a - ((w + 1) * (w + 1) - 1) * (w * z) * (w * z) = 1,
id ┴ ┴
src ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ └──┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └───
typ ─┘ └────┘┴┴ ┴ ┴ ┴ ┴┴ └──┘ ┴ ┴ └──┘ └──┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └───
doc ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ └──┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └───
txt ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ └──┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └───
par ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ └──┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └───
pid ─┘ └────┘ ┴ ┴ ┴ ┴ ┴ └──┘ ┴ ┴ └──┘ └──┘ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └┘ └───
st ─────────────────────────────────────────────────────────────────────
666 by rw ← ze; exact pell_eq w1 w,
id └┘ └─────┘ └┘ ┴
src ──────┘└───┘ └──────┘└─────┘┴ ┴ └─
typ ──────┘└───┘└┘└──────┘└─────┘┴└┘┴┴└─
doc ──────┘└───┘ └──────┘ ┴ ┴ └─
txt ──────┘└───┘ └──────┘ ┴ ┴ └─
par ──────┘└───┘ └──────┘ ┴ ┴ └─
pid ───────────┘ └──────┘ ┴ ┴ └─
st ─────┘└──────────────────────────┘└─
667 ⟨w, a, t, z, a1, tm, ta, mt, nw, kw, zp⟩,
id ┴ ┴ └┘
src ─┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ ┴
typ ─┘ ┴└┘┴└┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘└┘└┘ ┴
doc ─┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ ┴
txt ─┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ ┴
par ─┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ ┴
pid ─┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ └┘ ┴
st ─────────────────────────────────────────┘
668 λo, match o with
id ┴ ┴
typ ┴ ┴
669 | or.inl ⟨k0, m1⟩ := by rw [k0, m1]; refl
id └────┘ └┘ └┘
src └────┘ └──┘ └┘ ┴ └───┘
typ └────┘ └──┘└┘└┘└┘┴ └───┘
doc └──┘ └┘ ┴ └───┘
txt └──┘ └┘ ┴ └───┘
par └──┘ └┘ ┴ └───┘
pid └┘ └┘ ┴ ┴
st └─────┘└──┘┴└─────┘
670 | or.inr ⟨kpos, or.inl ⟨n0, m0⟩⟩ := by rw [n0, m0, nat.zero_pow kpos]
id └────┘ └────┘ └┘ └┘ └──────────┘ └──┘
src └────┘ └────┘ └──┘ └┘ └┘└──────────┘┴ └┘
typ └────┘ └────┘ └──┘└┘└┘└┘└┘└──────────┘┴└──┘└┘
doc └──┘ └┘ └┘ ┴ └┘
txt └──┘ └┘ └┘ ┴ └┘
par └──┘ └┘ └┘ ┴ └┘
pid └┘ └┘ └┘ ┴ ┴┴
st └─────┘└──┘└─────────────────┘┴┴
671 | or.inr ⟨kpos, or.inr ⟨npos, w, a, t, z,
id └────┘ └──┘ ┴
src └────┘
typ └────┘ └──┘ ┴
672 (a1 : a > 1),
id ┴
src ┴
typ ┴
673 (tm : xn a1 k ≡ yn a1 k * (a - n) + m [MOD t]),
id └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴
src └┘ ┴ └┘ ┴ ┴ ┴ └──┘ ┴
typ └┘ ┴ ┴ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └──┘ ┴
doc └┘ ┴ └┘ └──┘ ┴
674 (ta : 2 * a * n = t + (n * n + 1)),
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
675 (mt : m < t),
id ┴ ┴
src ┴
typ ┴ ┴
676 (nw : n ≤ w),
id ┴ ┴ ┴
src ┴
typ ┴ ┴ ┴
677 (kw : k ≤ w),
id ┴ ┴
src ┴
typ ┴ ┴
678 (zp : a * a - ((w + 1) * (w + 1) - 1) * (w * z) * (w * z) = 1)⟩⟩ :=
id ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
src ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
typ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴
679 have wpos : w > 0, from lt_of_lt_of_le npos nw,
id ┴ └────────────┘
src ┴ └────────────┘
typ ┴ └────────────┘
680 have w1 : w + 1 > 1, from nat.succ_lt_succ wpos,
id ┴ ┴ └──────────────┘ └──┘
src ┴ ┴ └──────────────┘
typ ┴ ┴ └──────────────┘ └──┘
681 let ⟨j, xj, yj⟩ := eq_pell w1 zp in
id └─┘ └─────┘ └┘
src └─────┘
typ └─┘ └─────┘ └┘
682 by clear _match o _let_match; exact
src └───────────────────────┘ └─────
typ └───────────────────────┘ └─────
doc └───────────────────────┘ └─────
txt └───────────────────────┘ └─────
par └───────────────────────┘ └─────
pid └──────────────────┘ └
st └─────────────────────────────────
683 have jpos : j > 0, from (nat.eq_zero_or_pos j).resolve_left $ λj0,
id └────────────────┘ ┴
src ─┘ └──────┘ ┴ └───────┘ └────────────────┘┴ └─────────────┘ ┴ └───
typ ─┘ └──────┘ ┴ └───────┘ └────────────────┘┴┴└─────────────┘ ┴ └───
doc ─┘ └──────┘ ┴ └───────┘ ┴ └─────────────┘ ┴ └───
txt ─┘ └──────┘ ┴ └───────┘ ┴ └─────────────┘ ┴ └───
par ─┘ └──────┘ ┴ └───────┘ ┴ └─────────────┘ ┴ └───
pid ─┘ └──────┘ ┴ └───────┘ ┴ └─────────────┘ ┴ └───
st ─────────────────────────────────────────────────────────────────────
684 have a1 : a = 1, by rw j0 at xj; exact xj,
id ┴ └┘ └┘
src ───┘ └────┘ ┴ └─────┘└─┘ └────┘└──────┘ └─
typ ───┘ └────┘┴┴ └─────┘└─┘└┘└────┘└──────┘└┘└─
doc ───┘ └────┘ ┴ └─────┘└─┘ └────┘└──────┘ └─
txt ───┘ └────┘ ┴ └─────┘└─┘ └────┘└──────┘ └─
par ───┘ └────┘ ┴ └─────┘└─┘ └────┘└──────┘ └─
pid ───┘ └────┘ ┴ └────────┘ └────────────┘ └─
st ──────────────────────┘└────────────────────┘└─
685 have 2 * n = t + (n * n + 1), by rw a1 at ta; exact ta,
id ┴ └┘ └┘
src ───┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────┘└─┘ └────┘└──────┘ └─
typ ───┘ └─┘ ┴ ┴ ┴┴┴ ┴ ┴ ┴ ┴ └──────┘└─┘└┘└────┘└──────┘└┘└─
doc ───┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────┘└─┘ └────┘└──────┘ └─
txt ───┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────┘└─┘ └────┘└──────┘ └─
par ───┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────┘└─┘ └────┘└──────┘ └─
pid ───┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └─────────┘ └────────────┘ └─
st ───────────────────────────────────┘└────────────────────┘└─
686 have n1 : n = 1, from
src ───┘ └────┘ ┴ └────────
typ ───┘ └────┘ ┴ └────────
doc ───┘ └────┘ ┴ └────────
txt ───┘ └────┘ ┴ └────────
par ───┘ └────┘ ┴ └────────
pid ───┘ └────┘ ┴ └────────
st ──────────────────────────
687 have n * n < n * 2, by rw [mul_comm n 2, this]; apply nat.le_add_left,
id └──────┘ ┴ └──┘ └─────────────┘
src ─────┘ └─┘ ┴ ┴ ┴ ┴ └─────┘└──┘└──────┘┴ └──┘ ┴└┘└────┘└─────────────┘└─
typ ─────┘ └─┘ ┴ ┴ ┴ ┴ └─────┘└──┘└──────┘┴┴└──┘└──┘┴└──────┘└─────────────┘└─
doc ─────┘ └─┘ ┴ ┴ ┴ ┴ └─────┘└──┘ ┴ └──┘ ┴└┘└────┘ └─
txt ─────┘ └─┘ ┴ ┴ ┴ ┴ └─────┘└──┘ ┴ └──┘ ┴└┘└────┘ └─
par ─────┘ └─┘ ┴ ┴ ┴ ┴ └─────┘└──┘ ┴ └──┘ ┴└──────┘ └─
pid ─────┘ └─┘ ┴ ┴ ┴ ┴ └─────────┘ ┴ └──┘ └───────┘ └─
st ───────────────────────────┘└──────────────┘└─────┘┴└─────────────────────┘└─
688 have n ≤ 1, from nat.le_of_lt_succ $ lt_of_mul_lt_mul_left this (nat.zero_le _),
id └───────────────┘ └───────────────────┘ └─────────┘
src ─────┘ └─┘ └───────┘└───────────────┘┴ ┴└───────────────────┘┴ ┴ └─────────┘└────
typ ─────┘ └─┘ └───────┘└───────────────┘┴ ┴└───────────────────┘┴ ┴ └─────────┘└────
doc ─────┘ └─┘ └───────┘ ┴ ┴ ┴ ┴ └────
txt ─────┘ └─┘ └───────┘ ┴ ┴ ┴ ┴ └────
par ─────┘ └─┘ └───────┘ ┴ ┴ ┴ ┴ └────
pid ─────┘ └─┘ └───────┘ ┴ ┴ ┴ ┴ └────
st ───────────────────────────────────────────────────────────────────────────────────────
689 le_antisymm this npos,
id └─────────┘ └──┘
src ─────┘└─────────┘┴ ┴ └─
typ ─────┘└─────────┘┴ ┴└──┘└─
doc ─────┘ ┴ ┴ └─
txt ─────┘ ┴ ┴ └─
par ─────┘ ┴ ┴ └─
pid ─────┘ ┴ ┴ └─
st ─────────────────────────────
690 by rw n1 at this;
id └┘
src ───┘ ┴└─┘ └──────┘└─
typ ───┘ ┴└─┘└┘└──────┘└─
doc ───┘ ┴└─┘ └──────┘└─
txt ───┘ ┴└─┘ └──────┘└─
par ───┘ ┴└─┘ └──────┘└─
pid ───┘ └──┘ └─────────
st ─────┘└───────────────
691 rw ← @nat.add_right_cancel 0 2 t this at mt;
id └──────────────────┘ ┴ └──┘
src ─────┘└───┘ └──────────────────┘└───┘ ┴ └────┘└─
typ ─────┘└───┘ └──────────────────┘└───┘┴┴└──┘└────┘└─
doc ─────┘└───┘ └───┘ ┴ └────┘└─
txt ─────┘└───┘ └───┘ ┴ └────┘└─
par ─────┘└───┘ └───┘ ┴ └────┘└─
pid ──────────┘ └───┘ ┴ └───────
st ───────────────────────────────────────────────────
692 exact nat.not_lt_zero _ mt,
id └─────────────┘ └┘
src ───────────┘└─────────────┘└─┘└┘└─
typ ───────────┘└─────────────┘└─┘└┘└─
doc ───────────┘ └─┘ └─
txt ───────────┘ └─┘ └─
par ───────────┘ └─┘ └─
pid ───────────┘ └─┘ └─
st ───────────────────────────────┘└─
693 have wj : w ≤ j, from nat.le_of_dvd jpos $ modeq.modeq_zero_iff.1 $
id └───────────┘
src ─┘ └────┘ ┴ ┴ └─────┘└───────────┘┴ ┴ ┴ └─┘ └
typ ─┘ └────┘ ┴ ┴ └─────┘└───────────┘┴ ┴ ┴ └─┘ └
doc ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ └─┘ └
txt ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ └─┘ └
par ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ └─┘ └
pid ─┘ └────┘ ┴ ┴ └─────┘ ┴ ┴ ┴ └─┘ └
st ──────────────────────────────────────────────────────────────────────
694 (yn_modeq_a_sub_one w1 j).symm.trans $
id └────────────────┘ └┘
src ───┘ └────────────────┘┴ ┴ └───────────┘ └
typ ───┘ └────────────────┘┴└┘┴ └───────────┘ └
doc ───┘ ┴ ┴ └───────────┘ └
txt ───┘ ┴ ┴ └───────────┘ └
par ───┘ ┴ ┴ └───────────┘ └
pid ───┘ ┴ ┴ └───────────┘ └
st ───────────────────────────────────────────
695 modeq.modeq_zero_iff.2 ⟨z, yj.symm⟩,
id └──────────────────┘ ┴ └─────┘
src ───┘└──────────────────┘└─┘ └┘└─────┘└──
typ ───┘└──────────────────┘└─┘ ┴└┘└─────┘└──
doc ───┘ └─┘ └┘ └──
txt ───┘ └─┘ └┘ └──
par ───┘ └─┘ └┘ └──
pid ───┘ └─┘ └┘ └──
st ─────────────────────────────────────────
696 have nt : (↑(n^k) : ℤ) < 2 * a * n - n * n - 1, from
src ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
typ ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
doc ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
txt ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
par ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
pid ─┘ └────┘ └──┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └────────
st ───────────────────────────────────────────────────────
697 eq_pow_of_pell_lem a1 npos kpos $ calc
id └────────────────┘ └┘ └──┘
src ───┘└────────────────┘┴ ┴ ┴ ┴ ┴ └
typ ───┘└────────────────┘┴└┘┴ ┴└──┘┴ ┴ └
doc ───┘ ┴ ┴ ┴ ┴ ┴ └
txt ───┘ ┴ ┴ ┴ ┴ ┴ └
par ───┘ ┴ ┴ ┴ ┴ ┴ └
pid ───┘ ┴ ┴ ┴ ┴ ┴ └
st ───────────────────────────────────────────
698 n^k ≤ n^j : nat.pow_le_pow_of_le_right npos (le_trans kw wj)
id ┴ └────────────────────────┘ └──────┘ └┘
src ─────┘ ┴ ┴ └───────┘└────────────────────────┘┴ ┴ └──────┘┴ ┴ └─
typ ─────┘ ┴┴ ┴ └───────┘└────────────────────────┘┴ ┴ └──────┘┴└┘┴ └─
doc ─────┘ ┴ ┴ └───────┘ ┴ ┴ ┴ ┴ └─
txt ─────┘ ┴ ┴ └───────┘ ┴ ┴ ┴ ┴ └─
par ─────┘ ┴ ┴ └───────┘ ┴ ┴ ┴ ┴ └─
pid ─────┘ ┴ ┴ └───────┘ ┴ ┴ ┴ ┴ └─
st ─────────────────────────────────────────────────────────────────────────
699 ... < (w + 1)^j : nat.pow_lt_pow_of_lt_left (nat.lt_succ_of_le nw) jpos
id ┴ └───────────────────────┘ └───────────────┘ └┘
src ─────────┘ ┴ ┴ └─┘ └─┘└───────────────────────┘┴ └───────────────┘┴ └┘ └
typ ─────────┘ ┴ ┴┴ └─┘ └─┘└───────────────────────┘┴ └───────────────┘┴└┘└┘ └
doc ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
txt ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
par ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
pid ─────────┘ ┴ ┴ └─┘ └─┘ ┴ ┴ └┘ └
st ──────────────────────────────────────────────────────────────────────────────
700 ... ≤ xn w1 j : xn_ge_a_pow w1 j
id └┘ └─────────┘
src ─────────┘ ┴└┘┴ ┴ └───┘└─────────┘┴ ┴ └
typ ─────────┘ ┴└┘┴ ┴ └───┘└─────────┘┴ ┴ └
doc ─────────┘ ┴└┘┴ ┴ └───┘ ┴ ┴ └
txt ─────────┘ ┴ ┴ ┴ └───┘ ┴ ┴ └
par ─────────┘ ┴ ┴ ┴ └───┘ ┴ ┴ └
pid ─────────┘ ┴ ┴ ┴ └───┘ ┴ ┴ └
st ─────────────────────────────────────────
701 ... = a : xj.symm,
id └─────┘
src ─────────┘ ┴ └─────────┘└─────┘└─
typ ─────────┘ ┴ └─────────┘└─────┘└─
doc ─────────┘ ┴ └─────────┘ └─
txt ─────────┘ ┴ └─────────┘ └─
par ─────────┘ ┴ └─────────┘ └─
pid ─────────┘ ┴ └─────────┘ └─
st ─────────────────────────────────
702 have na : n ≤ a, by rw xj; exact
id └┘
src ─┘ └────┘ ┴ ┴ └───┘└─┘ └───────
typ ─┘ └────┘ ┴ ┴ └───┘└─┘└┘└───────
doc ─┘ └────┘ ┴ ┴ └───┘└─┘ └───────
txt ─┘ └────┘ ┴ ┴ └───┘└─┘ └───────
par ─┘ └────┘ ┴ ┴ └───┘└─┘ └───────
pid ─┘ └────┘ ┴ ┴ └──────┘ └───────
st ────────────────────┘└─────────────
703 le_trans (le_trans nw wj) (le_of_lt $ n_lt_xn _ _),
id └──────┘ └┘ └┘ └──────┘ └─────┘
src ───┘ ┴ └──────┘┴ ┴ └┘ └──────┘┴ ┴└─────┘└──────
typ ───┘ ┴ └──────┘┴└┘┴└┘└┘ └──────┘┴ ┴└─────┘└──────
doc ───┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────
txt ───┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────
par ───┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────
pid ───┘ ┴ ┴ ┴ └┘ ┴ ┴ └──────
st ─────────────────────────────────────────────────────┘└─
704 have te : (t : ℤ) = 2 * ↑a * ↑n - ↑n * ↑n - 1, by
src ─┘ └────┘ └─┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────
typ ─┘ └────┘ └─┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────
doc ─┘ └────┘ └─┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────
txt ─┘ └────┘ └─┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────
par ─┘ └────┘ └─┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────
pid ─┘ └────┘ └─┘ └┘ └─┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └──────
st ──────────────────────────────────────────────────┘└
705 rw sub_sub; apply eq_sub_of_add_eq; apply (int.coe_nat_eq_coe_nat_iff _ _).2;
id └─────┘ └──────────────┘ └────────────────────────┘
src ───┘└─┘└─────┘└┘└────┘└──────────────┘└┘└────┘ └────────────────────────┘└─────┘└─
typ ───┘└─┘└─────┘└──────┘└──────────────┘└──────┘ └────────────────────────┘└────────
doc ───┘└─┘ └┘└────┘ └┘└────┘ └─────┘└─
txt ───┘└─┘ └┘└────┘ └┘└────┘ └─────┘└─
par ───┘└─┘ └──────┘ └──────┘ └────────
pid ──────┘ └──────┘ └──────┘ └────────
st ──────────────────────────────────────────────────────────────────────────────────
706 exact ta.symm,
id └─────┘
src ─────────┘└─────┘└─
typ ─────────┘└─────┘└─
doc ─────────┘ └─
txt ─────────┘ └─
par ─────────┘ └─
pid ─────────┘ └─
st ────────────────┘└─
707 have xn a1 k ≡ yn a1 k * (a - n) + n^k [MOD t],
id └┘
src ─┘ └──┘ ┴ ┴ ┴└┘┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─
typ ─┘ └──┘ ┴ ┴ ┴└┘┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─
doc ─┘ └──┘ ┴ ┴ ┴└┘┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─
txt ─┘ └──┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─
par ─┘ └──┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─
pid ─┘ └──┘ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ └┘ ┴ ┴ ┴ └─
st ──────────────────────────────────────────────────
708 by have := x_sub_y_dvd_pow a1 n k;
id └─────────────┘ └┘ ┴ ┴
src ──────┘└──────┘└─────────────┘┴ ┴ ┴ └─
typ ──────┘└──────┘└─────────────┘┴└┘┴┴┴┴└─
doc ──────┘└──────┘ ┴ ┴ ┴ └─
txt ──────┘└──────┘ ┴ ┴ ┴ └─
par ──────┘└──────┘ ┴ ┴ ┴ └─
pid ──────────────┘ ┴ ┴ ┴ └─
st ─────┘└────────────────────────────────
709 rw [← te, ← int.coe_nat_sub na] at this; exact modeq.modeq_of_dvd this,
id └┘ └─────────────┘ └┘ └────────────────┘ └──┘
src ──────┘└────┘ └──┘└─────────────┘┴ └───────┘└──────┘└────────────────┘┴ └─
typ ──────┘└────┘└┘└──┘└─────────────┘┴└┘└───────┘└──────┘└────────────────┘┴└──┘└─
doc ──────┘└────┘ └──┘ ┴ └───────┘└──────┘ ┴ └─
txt ──────┘└────┘ └──┘ ┴ └───────┘└──────┘ ┴ └─
par ──────┘└────┘ └──┘ ┴ └───────┘└──────┘ ┴ └─
pid ────────────┘ └──┘ ┴ └───────────────┘ ┴ └─
st ──────────┘└──┘└────────────────────┘┴└─────────────────────────────────────┘└─
710 have n^k % t = m % t, from
id ┴ ┴
src ─┘ └┘ ┴┴┴ ┴ ┴ ┴ ┴ └──────
typ ─┘ └┘ ┴┴┴ ┴ ┴┴┴ ┴ └──────
doc ─┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └──────
txt ─┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └──────
par ─┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └──────
pid ─┘ └┘ ┴ ┴ ┴ ┴ ┴ ┴ └──────
st ─────────────────────────────
711 modeq.modeq_add_cancel_left (modeq.refl _) (this.symm.trans tm),
id └─────────────────────────┘ └────────┘ └───┘└────┘ └┘
src ───┘└─────────────────────────┘┴ └────────┘└──┘ └───┘└────┘┴ └──
typ ───┘└─────────────────────────┘┴ └────────┘└──┘ └───┘└────┘┴└┘└──
doc ───┘ ┴ └──┘ ┴ └──
txt ───┘ ┴ └──┘ ┴ └──
par ───┘ ┴ └──┘ ┴ └──
pid ───┘ ┴ └──┘ ┴ └──
st ─────────────────────────────────────────────────────────────────────
712 by rw ← te at nt;
id └┘
src ─┘ ┴└───┘ └────┘└─
typ ─┘ ┴└───┘└┘└────┘└─
doc ─┘ ┴└───┘ └────┘└─
txt ─┘ ┴└───┘ └────┘└─
par ─┘ ┴└───┘ └────┘└─
pid ─┘ └────┘ └───────
st ───┘└───────────────
713 rwa [nat.mod_eq_of_lt (int.lt_of_coe_nat_lt_coe_nat nt), nat.mod_eq_of_lt mt] at this
id └──────────────┘ └──────────────────────────┘ └┘ └──────────────┘ └┘
src ────┘└───┘└──────────────┘┴ └──────────────────────────┘┴ └─┘└──────────────┘┴└┘└────────┘
typ ────┘└───┘└──────────────┘┴ └──────────────────────────┘┴└┘└─┘└──────────────┘┴└┘└────────┘
doc ────┘└───┘ ┴ ┴ └─┘ ┴ └────────┘
txt ────┘└───┘ ┴ ┴ └─┘ ┴ └────────┘
par ────┘└───┘ ┴ ┴ └─┘ ┴ └────────┘
pid ─────────┘ ┴ ┴ └─┘ ┴ └────────┘
st ─────────┘└────────────────────────────────────────────────┘└───────────────────┘┴└───────┘
714 end⟩
715
716 end pell